如何解决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
用于禁用响应缓冲;下面是一个示例:
-
添加以下名称空间
using Microsoft.AspNetCore.Http.Features;
-
在要禁用响应缓冲的 IActionResults 中,使用
DisableBuffering()
方法,其中:
为响应选择退出写缓冲
var bufferingFeature2 = HttpContext.Features.Get<IHttpResponseBodyFeature>();
bufferingFeature2?.DisableBuffering();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。