在ASP.NET 5响应中设置Content-Length标头
TL; DR我有一个ASP.NET 5(MVC 6)应用程序,只是尝试设置HTTP Content-Length标头以避免分块响应.
令我惊讶的是,碰巧这是在ASP.NET 5中完成的一项非常棘手的任务.一切都在Kestrel上运行,它来自ASP.NET 5 Beta7 supports writing chunked responses automatically when no content length is specified for the response. 有一个类似的问题here,但区别在于OP只想计算响应大小,而我需要确保在响应中发送Content-Length标头.到目前为止尝试了许多事情,唯一有效的是编写自定义中间件: public class WebApiMiddleware { RequestDelegate _next; public WebApiMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { using (var buffer = new MemoryStream()) { var response = context.Response; var bodyStream = response.Body; response.Body = buffer; await _next(context); response.Headers.Add("Content-Length",new[] { buffer.Length.ToString()}); buffer.Position = 0; await buffer.CopyToAsync(bodyStream); } } } 但是,这是非常低效的,因为我们在处理每个请求时使用额外的内存.使用仅包装context.Response.Body流并且另外计算字节的自定义流不起作用,因为Microsoft团队声明once the amount of data they’re willing to buffer has been written,it goes out on the wire and they don’t store it any more,所以我最多可以将Content-Length添加到最后一个不是希望的行为 – 我想完全避免分块. 任何帮助都非常感谢! 附:我知道分块是HTTP / 1.1的常规功能,但在我的场景中它会降低性能,所以我想避免它而不强迫客户端发送HTTP / 1.0请求. 解决方法
您需要在发送响应之前发送标头,因此您需要在发送之前存储整个响应以确定长度.
正如你所说的context.Response.Body流在发送之前没有存储太多,所以开销不是那么大. 有中间件做类似的事情:https://github.com/aspnet/BasicMiddleware/blob/dev/src/Microsoft.AspNet.Buffering/ResponseBufferingMiddleware.cs它与你写的非常相似,但支持其他功能,如IHttpBufferingFeature,允许其他中间件控制缓冲. 检查bufferStream.CanSeek是否确保没有人将响应流包装到缓冲流中并避免双缓冲. 对于你的第二个问题:这个地方是middlware. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 如何从HttpContext访问ViewData? (ASP.Net
- ASP.NET web.config文件中的环境变量
- asp.net-mvc – FormsAuthentication.RedirectFromLoginPag
- asp.net – 递归控制搜索与LINQ
- asp.net-core – ASP.NET MVC6脚手架在BETA 8中不起作用
- asp.net – 防火墙背后的应用洞察
- 在asp.net中发布回发和浏览器后退按钮问题
- asp.net – 启用了slidingExpiration的FormsAuthentication
- 如何在IIS10中正确启动asp.net应用程序
- asp.net-mvc – NLog,Elmah共享库
- asp.net-mvc-3 – asp.net mvc 3应用程序中的默认
- asp.net-mvc – ASP.NET MVC的示例企业应用程序?
- asp.net – 在.NET Core 1.0 MVC中的视图中使用授
- [ASP.NET MVC] 利用动态注入HTML的方式来设计复杂
- asp.net-mvc – 在构建时尝试构建ASP MVC视图时出
- .net – 在黄屏死亡的地方有执行吗?
- asp.net-mvc-2 – User.Identity数据来自哪里?
- asp.net-mvc-3 – WSFederationAuthenticationMo
- ASP.NET页面创建的事件序列
- 如何用Asp.net中的javascript检测IE 11