为何未传入初始数据的MemoryStream在.NET Core请求管道中会存在响应数据
代码运行原理解释
- .NET Core 请求管道默认的
HttpContext.Response.Body是底层封装的只写网络流:所有后续中间件、接口业务逻辑生成的响应内容,默认都会直接写入这个网络流返回给客户端,该流不支持读取操作,内容写完后就直接发走不会留存。 - 你执行
context.Response.Body = swapStream;这行代码的本质是替换了响应输出的目标流:原本要写入默认网络流的所有响应内容,后续都会写入你自己实例化的这个空MemoryStream中。 - 当执行到
await next.Invoke();时,管道中排在当前中间件之后的所有逻辑(包括其他中间件、路由匹配后的接口处理逻辑)都会全部执行完成,所有响应内容此时已经完整写入到swapStream中,所以你初始化时是空的流,到读取的时候已经有了完整的响应数据。 - 如果你删除替换流的那行代码,你自己创建的
swapStream没有被任何逻辑写入数据,自然读不到任何内容。
内容的提问来源于stack exchange,提问作者Masoud Keshavarz
相关产品推荐
相关产品推荐

