.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/

    相关文章:

    c# - 使用扩展方法替换字符串

    c# - Task.WaitAll 不等待其他异步方法

    c# - 串行端口事件的可视化器(用于发送和接收的数据)

    dependency-injection - .net 核心中的依赖注入(inject),Autofac、StructureMap 和工厂方法,如果注册了多个实现,则解析接口(interface)

    python - 如何控制多线程中的内存使用?

    java - Asset Manager 加载 pixmap outof mem Libgdx Java

    c# - 是否可以让 Convert.ChangeType() 接受货币?

    c# - Asp.Net 核心和脚手架

    c# - 在自定义InvalidModelStateResponseFactory asp.net核心2.2中读取请求正文

    java - 大数组 - 内存不足错误