在 ASP.NET Core 中,多次存取回應流可能具有挑戰性。本文探討了預設 Response.Body 行為的局限性,並提供了一種在自訂中間件中讀取響應流的解決方案。
在 ASP.NET Core 中,Response.Body 是一個只寫屬性,這表示它並非旨在在同一請求週期內從中讀取。這是框架效能最佳化的組成部分,但如果您需要多次存取回應流,則可能會帶來困難。
文中提到的解決方案似乎不是最佳的,因為它涉及用 MemoryStream 取代 Response.Body 流以進行讀取。這確實是一種有效的方法,儘管有點間接。
從 ASP.NET Core 2.1 開始,有一種更好的方法可以多次存取回應流:啟用緩衝。新的 Request.EnableBuffering() 方法可用於將回應流升級到 FileBufferingReadStream,後者支援查找和多次讀取。
將請求緩衝整合到中間件相對簡單。以下程式碼示範如何操作:
<code class="language-csharp">public class ResponseRewindMiddleware { private readonly RequestDelegate next; public ResponseRewindMiddleware(RequestDelegate next) { this.next = next; } public async Task Invoke(HttpContext context) { Stream originalBody = context.Response.Body; try { using (var memStream = new MemoryStream()) { context.Response.Body = memStream; await next(context); memStream.Position = 0; string responseBody = new StreamReader(memStream).ReadToEnd(); memStream.Position = 0; await memStream.CopyToAsync(originalBody); } } finally { context.Response.Body = originalBody; } } }</code>
替換 Response.Body 流可以作為一種在中間件中多次讀取響應流的可行方法。但是,首選方法是使用 Request.EnableBuffering() 啟用回應流上的緩衝。
以上是如何在中間件中多次讀取ASP.NET Core Response.Body?的詳細內容。更多資訊請關注PHP中文網其他相關文章!