解决.net core下HttpContext.Request.Body多次读取出现异常的问题

如下面的代码,使用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很大时,会存在性能上的问题。

你可能感兴趣的:(.Net,Core)