直接读取 ASP.NET Core 中的 Response.Body
属性是有问题的,因为它被指定为仅设置。 当需要在写入后访问响应内容时,这提出了一个挑战。
当前的解决方法通常涉及将 Response.Body
替换为 MemoryStream
,将内容读入字符串,然后恢复原始流。 此方法虽然有效,但由于其复杂性和潜在的性能开销而并非最佳。
更高效的解决方案利用自定义中间件来创建支持查找的缓冲流。这避免了以前方法中不必要的流交换。 虽然 ASP.NET Core 本质上不支持写入后读取响应流,但自定义中间件提供了一个干净的解决方案。
以下中间件简化了该过程:
<code class="language-csharp">public class ResponseCaptureMiddleware { private readonly RequestDelegate _next; public ResponseCaptureMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { var originalBody = context.Response.Body; using (var memoryStream = new MemoryStream()) { context.Response.Body = memoryStream; await _next(context); memoryStream.Seek(0, SeekOrigin.Begin); string responseBody = new StreamReader(memoryStream).ReadToEnd(); //Process responseBody here... memoryStream.Seek(0, SeekOrigin.Begin); await memoryStream.CopyToAsync(originalBody); } } }</code>
此中间件暂时用 Response.Body
替换 MemoryStream
,捕获响应内容,然后将内容重定向到原始流。 至关重要的是,响应内容 (responseBody
) 可在中间件内进行处理。
虽然 Response.Body
是仅设置的,但可以使用自定义中间件方法来访问其内容。此方法提供了一种简化且更有效的方法来处理 ASP.NET Core 应用程序中的响应流操作。
以上是如何读取 ASP.NET Core 中的 Set-Only Response.Body 属性?的详细内容。更多信息请关注PHP中文网其他相关文章!