面向云技术架构 - 痴者工良

  • 首页
  • 工良写的电子书
    • kubernetes 教程
    • 从 C# 入门 Kafka
    • 多线程和异步
    • 动态编程-反射、特性、AOP
    • 表达式树
  • 本站文章导航
  • 隐私政策
愿有人陪你颠沛流离
遇到能让你付出的事物或者人,都是一种运气。
能遇到,就该珍惜。或许你们最终没能在一起,但你会切实地感受到力量。
正因为这样,那段相遇才变得有价值,才没有辜负这世间的每一段相遇。
  1. 首页
  2. .NET
  3. 正文

ASP.NET Core 如何修改 Response Stream

2022年9月30日 596点热度 0人点赞 0条评论
内容纲要

ASP.NET Core Response.Body 默认是 HttpResponseStream,其主要特征是只能追加写,不能读取也不能修改。
file

所以最根本方法是替换 HttpResponseStream。

随便设置一个中间件,或者将 HttpContext 拿出来,定义变量 context。

替换 Body:

            var responseOriginalBody = context.Response.Body;
            var memStream = new MemoryStream();
            context.Response.Body = memStream;

必须在写入 Response 之前执行这个代码,替换 Stream,否则一切努力都会白费。

执行中间件,获取写入的内容:

            await next(context);

获取响应的内容:

            memStream.Position = 0;
            var responseReader = new StreamReader(memStream, Encoding.UTF8);
            var responseBody = await responseReader.ReadToEndAsync();

重新使用 HttpResponseStream,将响应的数据修改后再放到 HttpResponseStream。

            // 修改内容,代码省略

            memStream.Position = 0;
            // 将 memStream 修改后的内容写到 HttpResponseStream
            await memStream.CopyToAsync(responseOriginalBody);

            context.Response.Body = responseOriginalBody;
            // 可以正常追加了
            await context.Response.WriteAsync(",上班有三好,好困,好饿,好烦");

file

完整代码:

            // 请求流处理
            // https://learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware/request-response?view=aspnetcore-6.0
            var proxyFeature = context.GetReverseProxyFeature();
            var cluster = proxyFeature.Cluster;
            var destinations = proxyFeature.AvailableDestinations;

            //设置stream存放ResponseBody
            var responseOriginalBody = context.Response.Body;
            var memStream = new MemoryStream();
            context.Response.Body = memStream;

            // 执行其他中间件
            await next(context);

            //处理执行其他中间件后的ResponseBody
            memStream.Position = 0;
            var responseReader = new StreamReader(memStream, Encoding.UTF8);
            var responseBody = await responseReader.ReadToEndAsync();

            memStream.Position = 0;
            await memStream.CopyToAsync(responseOriginalBody);

            context.Response.Body = responseOriginalBody;
            await context.Response.WriteAsync(",上班有三好,好困,好饿,好烦");
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: asp core net response stream
最后更新:2022年9月30日

痴者工良

高级程序员劝退师

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2022 whuanle.cn. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备18051778号

粤公网安备 44030902003257号