.net - ASP.NET Core 禁用请求缓冲(不是响应缓冲)

标签 .net asp.net-core out-of-memory

我找到了控制响应缓冲的好答案。但我需要禁用请求缓冲。
问题的简短版本:
我发现后台有一个缓冲区,里面填满了请求数据。断点请求方法不会暂停此过程,因此它显然是由后台线程完成的。我遵循了一些说明(例如关闭 FormValueProviderFactory),但它们并没有阻止这种行为。
问题的长版本:
我已经实现了代码 here .
该示例创建了一个名为 DisableFormValueModelBindingAttribute 的过滤器属性,文档声称该属性可防止将文件加载到内存中,但它没有此效果。在请求开始流式传输之后命中过滤器。
但是我发现整个请求仍然缓冲到内存中。它达到请求内存限制并开始存储在磁盘中,但这会导致服务器耗尽磁盘空间。由于该服务托管在 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.
令人失望,因为当这个答案出现时我很兴奋!
更多信息
经过一些实验,我已经弄清楚了一些事情。我将请求从 Controller 移到中间件中。
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未实现或公开,因此我们没有可调用的方法来禁用请求缓冲。在 中只有一种方法可以禁用响应缓冲。 IHttpResponseBodyFeature 使用 DisableBuffering方法。
我在 GitHub 上搜索,发现 IHttpRequestBodyFeature 的结果很少。
https://github.com/search?q=IHttpRequestBodyFeature&type=此外,还支持该接口(interface)尚不可用或向我们公开的想法。如果您搜索 IHttpResponseBodyFeature另一方面,您可以从 dotnet 和 aptnetcore 获得很多结果。
我建议为 IHttpRequestBodyFeature 提交问题此处不可用:
https://github.com/dotnet/aspnetcore/issues
我在 IHttpResponseFeature 中找不到禁用请求缓冲的方法.没有method提供这样做。但是对于 IHttpResponseBodyFeature有一个method禁用响应缓冲;下面是一个例子:

  • 添加以下命名空间using Microsoft.AspNetCore.Http.Features;
  • 在你想要的 IActionResults 中响应缓冲 禁用使用DisableBuffering()方法:

  • Opts out of write buffering for the response

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

    关于.net - ASP.NET Core 禁用请求缓冲(不是响应缓冲),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63396343/

    相关文章:

    .net - 通过组策略部署 VSTOR 4 框架 MSI

    c# - 从 .NET 应用程序枚举和读取 Java 应用程序的 UI 控件

    c# - 不包含带 4 个参数的构造函数?

    docker - 如何在Mac上将ASP.Net Core连接到SQL Server Docker容器

    c# - POST HttpRequestMessage 为空

    razor - Razor页面在运行时无法在ASP.NET Core RC2中看到引用的类库

    javascript - 正则表达式可以在 JavaScript 中工作,但不能在 C# 中工作

    java - 用Java缓存大量空间数据——可行吗?

    hadoop - 5.6 GB 对 Cloudera 来说还不够吗?

    Php laravel内存限制错误