ASP.NET Core の Response.Body の効率的な読み取り: MemoryStream スワッピングの代替手段
読み取り専用ストリームである ASP.NET Core で Response.Body
にアクセスすることには課題が伴います。 MemoryStream
と交換するのが一般的な回避策ですが、最適ではありません。この記事では、より効率的な代替手段を検討します。
問題: ASP.NET Core でパフォーマンスを最適化するために設計された読み取り専用であるため、Response.Body
を直接読み取ることには問題があります。
非効率な解決策 (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
の読み取り効率を大幅に向上させることができます。 これらのソリューションを実装する前に、パフォーマンスへの影響を慎重に比較検討してください。
以上がASP.NET Core で Response.Body を読み取るための、MemoryStream スワッピングを使用するより効率的な方法はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。