【发布时间】:2020-12-03 08:55:57
【问题描述】:
我找到了控制响应缓冲的好方法。但我需要禁用 REQUEST 缓冲。
短版问题:
我发现后台有一个缓冲区,里面填满了请求数据。断点请求方法不会暂停此过程,因此它显然是由后台线程完成的。我遵循了一些说明(例如关闭 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.
令人失望,因为当这个答案出现时我很兴奋!
更多信息
经过一些实验,我已经弄清楚了一些事情。我将请求从控制器移到中间件中。
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 关于缓冲是可配置的,主要是抱怨它不是。这让我没有信心。
【问题讨论】:
标签: .net asp.net-core out-of-memory