高效率讀取 ASP.NET Core 的 Response.Body:MemoryStream 交換的替代方案
在 ASP.NET Core 中存取唯讀流 Response.Body
是一個挑戰。雖然用 MemoryStream
交換它是一種常見的解決方法,但這並不是最佳選擇。本文探討了更有效的替代方案。
問題:直接讀取 Response.Body
是有問題的,因為它是專為 ASP.NET Core 中的效能最佳化而設計的唯讀特性。
低效解決方案(MemoryStream 交換): 傳統方法是將 Response.Body
替換為 MemoryStream
,讀取內容,然後恢復原始流。 這是資源密集型的,並且可能會影響效能。
更好的方法:
雖然 MemoryStream 交換有效,但它並不是最有效的方法。 考慮以下替代方案:
Response.Body
重新導向到 MemoryStream
,讀取內容,然後恢復原始流。 這使得流操作邏輯在中間件內保持隔離。 這是一個簡化的範例:<code class="language-csharp">public class ResponseRewindMiddleware { private readonly RequestDelegate _next; public ResponseRewindMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { var originalBody = context.Response.Body; using var memoryStream = new MemoryStream(); context.Response.Body = memoryStream; await _next(context); memoryStream.Seek(0, SeekOrigin.Begin); using var reader = new StreamReader(memoryStream); string responseBody = await reader.ReadToEndAsync(); memoryStream.Seek(0, SeekOrigin.Begin); await memoryStream.CopyToAsync(originalBody); context.Response.Body = originalBody; } }</code>
Response.Body
。 重要注意事項:
Response.Body
的方法都會引入一些效能開銷。僅在絕對必要時才明智地使用這些技術。 try-catch
區塊)對於防止異常破壞應用程式至關重要。 透過使用中間件或回應快取(在適當的情況下),與直接 Response.Body
交換技術相比,您可以顯著提高讀取 MemoryStream
的效率。 請記住在實施這些解決方案之前仔細權衡效能影響。
以上是有沒有比使用 MemoryStream 交換更有效的方法來讀取 ASP.NET Core 中的 Response.Body?的詳細內容。更多資訊請關注PHP中文網其他相關文章!