ASP.NET Core で Response.Body
プロパティを直接読み取ると、セット専用として指定されているため問題が発生します。 これは、応答コンテンツが書き込まれた後にアクセスする必要がある場合に課題となります。
現在の回避策では、多くの場合、Response.Body
を MemoryStream
に置き換え、コンテンツを文字列に読み取り、元のストリームを復元します。 この方法は機能しますが、その複雑さとパフォーマンスのオーバーヘッドの可能性があるため、最適とは言えません。
より効率的なソリューションでは、カスタム ミドルウェアを活用して、シークをサポートするバッファリングされたストリームを作成します。これにより、以前のアプローチの不必要なストリーム スワップが回避されます。 ASP.NET Core は本質的に書き込み後の応答ストリームの読み取りをサポートしていませんが、カスタム ミドルウェアはクリーンなソリューションを提供します。
次のミドルウェアはプロセスを簡素化します:
<code class="language-csharp">public class ResponseCaptureMiddleware { private readonly RequestDelegate _next; public ResponseCaptureMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { var originalBody = context.Response.Body; using (var memoryStream = new MemoryStream()) { context.Response.Body = memoryStream; await _next(context); memoryStream.Seek(0, SeekOrigin.Begin); string responseBody = new StreamReader(memoryStream).ReadToEnd(); //Process responseBody here... memoryStream.Seek(0, SeekOrigin.Begin); await memoryStream.CopyToAsync(originalBody); } } }</code>
このミドルウェアは、Response.Body
を一時的に MemoryStream
に置き換え、応答コンテンツをキャプチャし、そのコンテンツを元のストリームにリダイレクトします。 重要なのは、応答コンテンツ (responseBody
) がミドルウェア内で処理できることです。
Response.Body
は設定専用ですが、その内容へのアクセスはカスタム ミドルウェア アプローチを使用して実現できます。このメソッドは、ASP.NET Core アプリケーションで応答ストリームの操作を処理するための合理化されたより効率的な方法を提供します。
以上がASP.NET Core で Set-Only Response.Body プロパティを読み取るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。