使用Enablebuffering多次讀取Asp Net Core 請求體


使用Enablebuffering多次讀取Asp Net Core 請求體

1 .Net Core 2.X時代

使用EnableRewind倒帶

public IActionResult Index()
{
    Request.EnableRewind();
    using (var reader = new StreamReader(Request.Body))
    {
        var body = reader.ReadToEnd();
        // Do something
        Request.Body.Seek(0, SeekOrigin.Begin);
        body = reader.ReadToEnd();
    }
    // More code
    return View("Index");
}

2 .NET Core 3.0時代

因為.NET Core 3.0 preview 6以后(6還是可以使用的), Microsoft.AspNetCore.Http.Internal不再是公有方法. 所以EnableRewind不能使用。

使用Enablebuffering

 public async Task<IActionResult> Index()
 {
 	Request.EnableBuffering();
 	using (var reader = new StreamReader(Request.Body, encoding: Encoding.UTF8))
 	{
 		var body = reader.ReadToEndAsync();
 		// Do some processing with body…
 		// Reset the request body stream position so the next middleware can read it
 		Request.Body.Position = 0;
 	}
 	return View();
 }
 
 // 默認不支持同步方法:ReadToEnd()
 // 需要設置AllowSynchronousIO=true;
 // System.InvalidOperationException: 'Synchronous operations are disallowed. Call ReadAsync or set AllowSynchronousIO to true instead.'

3. 參考

  1. Reading request body in ASP.NET Core

  2. EnableRewind 源碼

  3. Rereading Asp Net Core Request Bodies With Enablebuffering


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM