ASP.NET Core では、応答ストリームに複数回アクセスするのが困難な場合があります。この記事では、デフォルトの Response.Body 動作の制限を調査し、カスタム ミドルウェアで応答ストリームを読み取るためのソリューションを提供します。
ASP.NET Core では、Response.Body は書き込み専用のプロパティです。つまり、同じ要求サイクル内で読み取られることを意図していません。これはフレームワークのパフォーマンス最適化の一部ですが、応答ストリームに複数回アクセスする必要がある場合に問題が発生する可能性があります。
この記事で言及されている解決策は、Response.Body ストリームを読み取り用の MemoryStream に置き換えることを伴うため、最適とは言えません。これは、少し間接的ではありますが、確かに効果的なアプローチです。
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 中国語 Web サイトの他の関連記事を参照してください。