ASP.NET核心禁用请求缓冲(非响应缓冲)

ASP.NET核心禁用请求缓冲(非响应缓冲),.net,asp.net-core,out-of-memory,.net,Asp.net Core,Out Of Memory,我找到了一个控制响应缓冲的好答案。但是我需要禁用请求缓冲 问题的简短版本: 我发现在后台有一个缓冲区,里面装满了请求数据。中断请求方法不会暂停此进程,因此它显然是由后台线程完成的。我遵循了一些说明(例如关闭FormValueProviderFactory),但它们并不能阻止这种行为 问题的长版本: 我已经实现了代码 该示例创建了一个名为DisableFormValueModelBindingAttribute的筛选器属性,docs声称该属性阻止将文件加载到内存中,但它没有这种效果。请求开始流式传

我找到了一个控制响应缓冲的好答案。但是我需要禁用请求缓冲

问题的简短版本: 我发现在后台有一个缓冲区,里面装满了请求数据。中断请求方法不会暂停此进程,因此它显然是由后台线程完成的。我遵循了一些说明(例如关闭FormValueProviderFactory),但它们并不能阻止这种行为

问题的长版本: 我已经实现了代码

该示例创建了一个名为DisableFormValueModelBindingAttribute的筛选器属性,docs声称该属性阻止将文件加载到内存中,但它没有这种效果。请求开始流式传输后,过滤器被点击

但是我发现整个请求仍然被缓冲到内存中。它达到了请求内存限制,并开始存储在磁盘中,但这会导致服务器磁盘空间不足。由于服务托管在docker中,所以我只有几百MB可供使用。我真正需要的是将多部分请求缓冲到我可以读取它的位置

我正在将.net core 2.1与AspNetCore 2.1.1一起使用

关于Request.enablebuffer的说明 名称不正确-请求始终处于缓冲状态,这实际上是启用请求倒带

关于IHttpBufferingFeature.DisableBuffering的注释 这是奥塞利特。它没有实施细节。obselete标签上写着

[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();