在 ASP.NET Core 中,多次访问响应流可能具有挑战性。本文探讨了默认 Response.Body 行为的局限性,并提供了一种在自定义中间件中读取响应流的解决方案。
在 ASP.NET Core 中,Response.Body 是一个只写属性,这意味着它并非旨在在同一请求周期内从中读取。这是框架性能优化的组成部分,但如果您需要多次访问响应流,则可能会带来困难。
文中提到的解决方案似乎不是最佳的,因为它涉及用 MemoryStream 替换 Response.Body 流以进行读取。这确实是一种有效的方法,尽管有点间接。
从 ASP.NET Core 2.1 开始,有一种更好的方法可以多次访问响应流:启用缓冲。新的 Request.EnableBuffering() 方法可用于将响应流升级到 FileBufferingReadStream,后者支持查找和多次读取。
将请求缓冲集成到中间件中相对简单。以下代码演示了如何操作:
<code class="language-csharp">public class ResponseRewindMiddleware { private readonly RequestDelegate next; public ResponseRewindMiddleware(RequestDelegate next) { this.next = next; } public async Task Invoke(HttpContext context) { Stream originalBody = context.Response.Body; try { using (var memStream = new MemoryStream()) { context.Response.Body = memStream; await next(context); memStream.Position = 0; string responseBody = new StreamReader(memStream).ReadToEnd(); memStream.Position = 0; await memStream.CopyToAsync(originalBody); } } finally { context.Response.Body = originalBody; } } }</code>
替换 Response.Body 流可以作为一种在中间件中多次读取响应流的可行方法。但是,首选方法是使用 Request.EnableBuffering() 启用响应流上的缓冲。
以上是如何在中间件中多次读取ASP.NET Core Response.Body?的详细内容。更多信息请关注PHP中文网其他相关文章!