我找到了一个关于控制响应缓冲的好方法。但我需要禁用请求缓冲。
问题简述:
我发现后台有一个缓冲区,正在填充请求数据。在请求方法上设置断点并不能暂停此过程,因此很明显是由后台线程完成的。我按照一些说明(例如关闭FormValueProviderFactory)进行操作,但它们并不能阻止这种行为。
问题详述:
我实现了这里的代码。
示例创建了一个名为DisableFormValueModelBindingAttribute的筛选器属性,文档声称可以防止文件被加载到内存中,但它没有这种效果。该筛选器在请求开始流式传输之后才会被触发。
但我发现整个请求仍然被缓存在内存中。它达到了请求内存限制并开始存储在磁盘中,但这导致服务器的磁盘空间不足。由于服务托管在docker中,我只有几百MB可用。我真正需要的是"多部分请求只缓冲到我可以读取它的地方"。
我正在使用AspNetCore 2.1.1的.net core 2.1。
关于Request.EnableBuffering的说明:
名称不正确——请求总是被缓冲的,实际上这只是启用请求倒带。
关于IHttpBufferingFeature.DisableBuffering的说明:
这已经过时了。它没有实现细节。过时标签说:
但我发现有一个后台线程在填充请求缓冲区。我在中间件内设置了断点,但我仍然可以看到后台上传过程。请求缓冲区仍在填充。
答案可能与可以对HttpRequestFeature进行的可能配置有关。
进一步的信息
在UseKestrel的回调中,您可以配置限制,其中有一个限制
称为“MaxRequestBufferSize”
但默认情况下为1MB。因此,显然它不负责将完整请求缓冲到磁盘上。
我还发现a github issue关于缓冲可配置,主要是抱怨它没有。这让我感到缺乏信心。
问题简述:
我发现后台有一个缓冲区,正在填充请求数据。在请求方法上设置断点并不能暂停此过程,因此很明显是由后台线程完成的。我按照一些说明(例如关闭FormValueProviderFactory)进行操作,但它们并不能阻止这种行为。
问题详述:
我实现了这里的代码。
示例创建了一个名为DisableFormValueModelBindingAttribute的筛选器属性,文档声称可以防止文件被加载到内存中,但它没有这种效果。该筛选器在请求开始流式传输之后才会被触发。
但我发现整个请求仍然被缓存在内存中。它达到了请求内存限制并开始存储在磁盘中,但这导致服务器的磁盘空间不足。由于服务托管在docker中,我只有几百MB可用。我真正需要的是"多部分请求只缓冲到我可以读取它的地方"。
我正在使用AspNetCore 2.1.1的.net core 2.1。
关于Request.EnableBuffering的说明:
名称不正确——请求总是被缓冲的,实际上这只是启用请求倒带。
关于IHttpBufferingFeature.DisableBuffering的说明:
这已经过时了。它没有实现细节。过时标签说:
[Obsolete("See IHttpRequestBodyFeature or IHttpResponseBodyFeature DisableBuffering", error: true)]
但是IHttpRequestBodyFeature 不存在。
令人失望的是,当这个答案出现时,我感到很兴奋!
更多信息
经过一些实验,我已经找出了一些事情。我将请求从控制器中移出,并移到了一个中间件中。
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关于缓冲可配置,主要是抱怨它没有。这让我感到缺乏信心。