首页 > 后端开发 > C++ > 如何在中间件中多次读取ASP.NET Core Response.Body?

如何在中间件中多次读取ASP.NET Core Response.Body?

Mary-Kate Olsen
发布: 2025-01-08 16:22:42
原创
711 人浏览过

How Can I Read the ASP.NET Core Response.Body Multiple Times in Middleware?

ASP.NET Core 中间件多次读取 Response.Body

概述

在 ASP.NET Core 中,多次访问响应流可能具有挑战性。本文探讨了默认 Response.Body 行为的局限性,并提供了一种在自定义中间件中读取响应流的解决方案。

背景

在 ASP.NET Core 中,Response.Body 是一个只写属性,这意味着它并非旨在在同一请求周期内从中读取。这是框架性能优化的组成部分,但如果您需要多次访问响应流,则可能会带来困难。

“临时”解决方案:替换响应流

文中提到的解决方案似乎不是最佳的,因为它涉及用 MemoryStream 替换 Response.Body 流以进行读取。这确实是一种有效的方法,尽管有点间接。

为 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板