ASP.NET Core禁用请求缓冲非响应缓冲 问题的简短版本:问题的长版:关于Request.EnableBuffering的说明关于IHttpBufferingFeature.DisableBuffering的注释更多信息其他信息在撰写本文时,这是不可能的

问题描述

我已经找到了控制响应缓冲的好方法。但是我需要禁用REQUEST缓冲。

问题的简短版本:

我发现后台有一个缓冲区,填充了请求数据。断点request方法不会暂停此过程,因此它显然是由后台线程完成的。我遵循了一些说明(例如,关闭FormValueProviderFactory),但是它们并不能阻止这种行为。

问题的长版:

我已经实现了代码here

该示例创建了一个名为DisableFormValueModelBindingBindingAttribute的过滤器属性,文档声称该属性阻止文件加载到内存中,但没有此效果。在请求开始流式传输后点击过滤器。

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

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

关于Request.EnableBuffering的说明

名称不正确-请求始终处于缓冲状态,实际上是启用请求回绕。

关于IHttpBufferingFeature.DisableBuffering的注释

这是过时的。它没有实现细节。过时的标签说

[Obsolete("See IHttpRequestBodyFeature or IHttpResponseBodyFeature DisableBuffering",error: true)]

但是IHttpRequestBodyFeature doesn't exist.

令人失望,因为当这个答案出现时我很兴奋!

更多信息

经过一些实验,我发现了一些问题。我将请求从控制器移到了中间件中。

app.Use ((context,next) =>
{

    var Request = context.Request;

    if (MultipartRequestHelper.IsMultipartContentType(Request.ContentType))
    {
        // a breakpoint here doesn't stop the upload
        var path = Request.Path;

// ...

但是我发现有一个后台线程填充了请求缓冲区。我在中间件中设置了一个断点,但是仍然可以在后台看到上传。请求缓冲区仍在填充。

答案可能与可能对HttpRequestFeature进行的配置有关。

其他信息

在UseKestrel的回调中,您可以配置限制,并且有限制

称为“ MaxRequestBufferSize”

但是默认情况下这是1MB。因此很明显,它不负责将整个请求缓冲到磁盘。

我还发现a github issue关于缓冲是可配置的,主要是抱怨它不是可配置的。这并不能使我充满信心。

解决方法

在撰写本文时,这是不可能的。

IHttpRequestBodyFeature未实现或未公开,因此我们没有可用的方法来禁用请求缓冲。只能使用DisableBuffering方法在 IHttpResponseBodyFeature 中禁用响应缓冲。

我在GitHub上搜索,发现IHttpRequestBodyFeature的搜索结果最少 https://github.com/search?q=IHttpRequestBodyFeature&type=进一步支持该界面尚不可用或尚未向我们公开的想法。另一方面,如果您搜索IHttpResponseBodyFeature,则会从dotnet和aptnetcore获得很多结果。

我建议为IHttpRequestBodyFeature此处未提供的问题提交问题: https://github.com/dotnet/aspnetcore/issues

我找不到在IHttpResponseFeature中禁用请求缓冲的方法。没有提供method来这样做。但是,对于IHttpResponseBodyFeature,有一个method用于禁用响应缓冲;下面是一个示例:

  1. 添加以下名称空间

    using Microsoft.AspNetCore.Http.Features;

  2. 在要禁用响应缓冲 IActionResults 中,使用 DisableBuffering()方法,其中:

为响应选择退出写缓冲

var bufferingFeature2 = HttpContext.Features.Get<IHttpResponseBodyFeature>();
bufferingFeature2?.DisableBuffering();

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...