最近在中间件中获取 Request.Body 遇到一个问题,代码如下
context.Request.EnableBuffering();
StreamReader sr = new StreamReader(context.Request.Body);
var body = sr.ReadToEnd();
context.Request.Body.Position = 0;
StreamReader 如果主动释放掉会导致context.Request.Body也释放掉,如果StreamReader 不主动释放掉会不会在请求结束的时候自动释放掉?
1.StreamReader 是用于读取,不会有写入的问题,比如内存泄漏,这点不用担心。
2.关闭 StreamReader 的两个方法:
Close:关闭 System.IO.TextReader 并释放与该 TextReader 关联的所有系统资源。
Dispose:释放由 System.IO.TextReader 对象使用的所有资源。
如果你关闭 StreamReader,就会导致 context.Request.Body 被释放掉,但是如果你不关闭,有可能导致文件被持续占用,如果这个时候你需要删除就会出错。
3.从你的代码看,你不是操作文件,不释放没有问题。
4.不过为了更安全的编码,你可以使用 using:
context.Request.EnableBuffering();
using (StreamReader sr = new StreamReader(context.Request.Body))
{
sr.Dispose();
var body = sr.ReadToEnd();
context.Request.Body.Position = 0;
}
建议Request.Body就读取一次