如下面的代码,使用StreamReader多次读取HttpContext.Request.Body
public IActionResult SomeAction()
{
using (var reader = new StreamReader(Request.Body))
{
var body = reader.ReadToEnd();
// Do something
}
// More code
using (var reader = new StreamReader(Request.Body))
{
var body = reader.ReadToEnd();
// Do something else
}
return View();
}
会报出System.ObjectDisposedException:“Cannot access a disposed object.的异常,也就是被释放了。
使用流副本解决方案:
public IActionResult SomeAction()
{
using (var mem = new MemoryStream())
using (var reader = new StreamReader(mem))
{
Request.Body.Seek(0, SeekOrigin.Begin);
Request.Body.CopyTo(mem);
mem.Seek(0, SeekOrigin.Begin);
var body = reader.ReadToEnd();
// Do something
}
using (var mem = new MemoryStream())
using (var reader = new StreamReader(mem))
{
Request.Body.Seek(0, SeekOrigin.Begin);
Request.Body.CopyTo(mem);
mem.Seek(0, SeekOrigin.Begin);
var body = reader.ReadToEnd();
// Do something
}
// More code
return View();
}
不过这个方案在Request.Body很大时,会存在性能上的问题。