取消

net6之后读取response.body方式

asp.net core 3.1的时候可以直接通过StreamReader读取HttpContext.Response.Body,此方式在更新到.net6后不再可行。


问题

asp.net core 3.1的时候可以直接通过StreamReader读取HttpContext.Response.Body,此方式在更新到.net6后不再可行。调试发现HttpContext.Response.Body的CanRead属性是false,是一个可写不可读的流。

解决

.ne6之后要读取body必须用一个内存流替换原来的流,读取完成后再替换回去。以下示例代码是在中间件中写的:

1
2
3
4
5
6
7
8
using (var memoryStream = new MemoryStream())
{
    context.Response.Body = memoryStream;
    await _next.Invoke(context);//_next是下一个中间件
    context.Response.Body = currentBody;
    memoryStream.Seek(0, SeekOrigin.Begin);
    var responseBody = await new StreamReader(memoryStream).ReadToEndAsync();
}

原因

asp.net core 3.1的时候可以直接通过StreamReader读取HttpContext.Response.Body,此方式在更新到.net6后不再可行。


参考资料

本文会经常更新,请阅读原文: https://dashenxian.github.io/post/net6%E4%B9%8B%E5%90%8E%E8%AF%BB%E5%8F%96response.body%E6%96%B9%E5%BC%8F ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 小神仙 (包含链接: https://dashenxian.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (125880321@qq.com)

登录 GitHub 账号进行评论