ASP.NET核心禁用请求缓冲(非响应缓冲)
我找到了一个控制响应缓冲的好答案。但是我需要禁用请求缓冲 问题的简短版本: 我发现在后台有一个缓冲区,里面装满了请求数据。中断请求方法不会暂停此进程,因此它显然是由后台线程完成的。我遵循了一些说明(例如关闭FormValueProviderFactory),但它们并不能阻止这种行为 问题的长版本: 我已经实现了代码 该示例创建了一个名为DisableFormValueModelBindingAttribute的筛选器属性,docs声称该属性阻止将文件加载到内存中,但它没有这种效果。请求开始流式传输后,过滤器被点击 但是我发现整个请求仍然被缓冲到内存中。它达到了请求内存限制,并开始存储在磁盘中,但这会导致服务器磁盘空间不足。由于服务托管在docker中,所以我只有几百MB可供使用。我真正需要的是将多部分请求缓冲到我可以读取它的位置 我正在将.net core 2.1与AspNetCore 2.1.1一起使用 关于Request.enablebuffer的说明 名称不正确-请求始终处于缓冲状态,这实际上是启用请求倒带 关于IHttpBufferingFeature.DisableBuffering的注释 这是奥塞利特。它没有实施细节。obselete标签上写着ASP.NET核心禁用请求缓冲(非响应缓冲),.net,asp.net-core,out-of-memory,.net,Asp.net Core,Out Of Memory,我找到了一个控制响应缓冲的好答案。但是我需要禁用请求缓冲 问题的简短版本: 我发现在后台有一个缓冲区,里面装满了请求数据。中断请求方法不会暂停此进程,因此它显然是由后台线程完成的。我遵循了一些说明(例如关闭FormValueProviderFactory),但它们并不能阻止这种行为 问题的长版本: 我已经实现了代码 该示例创建了一个名为DisableFormValueModelBindingAttribute的筛选器属性,docs声称该属性阻止将文件加载到内存中,但它没有这种效果。请求开始流式传
[Obsolete("See IHttpRequestBodyFeature or IHttpResponseBodyFeature DisableBuffering", error: true)]
但我有前传的身体特征
令人失望,因为当这个答案出现时我很兴奋
更多信息
经过一些实验,我发现了一些东西。我将请求从一个控制器移到一个中间件中
app.Use((上下文,下一步)=>
{
var-Request=context.Request;
if(MultipartRequestHelper.IsMultipartContentType(Request.ContentType))
{
//此处的断点不会停止上载
var path=Request.path;
// ...
但是我发现有一个后台线程填充了请求缓冲区。我在中间件内部设置了一个断点,但是我仍然可以看到上传发生在后台。请求缓冲区仍然在填充
答案可能与人们可以对HttpRequestFeature进行的可能配置有关
进一步资料
在UseKestrel的回调中,您可以配置限制,并且有一个限制
称为“MaxRequestBufferSize”
但默认情况下这是1MB,所以很明显,它不负责将完整的请求缓冲到磁盘
我还发现缓冲是可配置的,主要是抱怨它不是。这并不能让我充满信心。在撰写本文时,这是不可能的。
IHttpRequestBodyFeature
未实现或公开,因此没有一种方法可供我们调用以禁用请求缓冲。只有一种方法可以使用DisableBuffering
方法在IHttpResponseBodyFeature中禁用响应缓冲
我在GitHub上搜索,找到了IHttpRequestBodyFeature
此外,支持这一想法的界面还不可用,也没有向我们公开。另一方面,如果您搜索IHttpResponseBodyFeature
,您将从dotnet和aptnetcore获得大量结果
我建议为IHttpRequestBodyFeature
提交一个问题,此处不可用:
我无法在IHttpResponseFeature
中找到禁用请求缓冲的方法。没有提供用于禁用请求缓冲的方法。但是使用IHttpResponseBodyFeature
有一个方法来禁用响应缓冲;下面是一个示例:
添加以下命名空间
使用Microsoft.AspNetCore.Http.Features;
在要禁用响应缓冲的IActionResults中,使用
禁用缓冲()
为响应选择写外缓冲
var bufferingFeature2=HttpContext.Features.Get();
缓冲功能2?.DisableBuffering();
@gburton我修改了答案,你能试试吗?当你第一次回答时,我真的很兴奋,因为我认为你已经找到了一个简单的解决方案。但是禁用缓冲不再存在。接口IHttpBufferingFeature被禁用(error=true,因此如果你使用它,你甚至无法编译)并将您引导到一个不再存在的API。您给出的引用是针对响应的,而不是请求的。您付出了很多努力,我真的很感激,但遗憾的是,答案是错误的。我刚才注意到修改后的答案引用了响应缓冲区。因此,它可能会起作用,但这是对不同问题的回答!我知道仍然感谢您所做的工作。希望我能接受这个答案并给您丰厚的奖励。您的答案似乎是正确的。遗憾的是,我们无法实际控制这个缓冲区,因此我将不得不编写OWIN中间件。从历史上看,大文件上传并没有很好地集成到asp.net中,而且似乎没有AspnetCore中的一个重要考虑因素。让我们来看看。
var bufferingFeature2 = HttpContext.Features.Get<IHttpResponseBodyFeature>();
bufferingFeature2?.DisableBuffering();