01
2019

ASP.NET CoreでHttpRequest/HttpResponseのBodyを参照する

CATEGORY.NET
ここ最近、他所のプロジェクトのヘルプでASP.NET Coreを触ってたのだけど、何点かハマったところがあって、かつ日本語の情報が無い(?)のもあったのでそういうのメモっとく。なおバージョンは2.1。初めはコンテンツボディの取得法について。

例えば詳細なアクセスログでリクエスト/レスポンスのボディまで出力したい、ってことはちょくちょくあると思う。
で、今回もそれやろうとしたのだけれど、デフォルトでは(たぶん性能対策のため)参照できないようだったので、Stack Overflowの丸写しだけどやり方解説。
まず HttpRequest については EnableBuffering() というメソッドを先に呼んでおけば、リクエストボディのバッファリングが有効になって、以後普通に再読み込み可能なStreamとして使用可能になる模様。簡単である。

一方面倒なのが HttpResponse の方。こちらは同じようなメソッドが用意されていないので(何故!?)、こんな感じに無理やりBodyのStreamを MemoryStream に差し替えてやる必要がある(以下ミドルウェアでの例)。
public async Task Invoke(HttpContext context)
{
var responseStream = context.Response.Body;
try
{
using (var memoryStream = new MemoryStream())
{
context.Response.Body = memoryStream;
await this.next(context);

memoryStream.Position = 0;
Console.WriteLine(new StreamReader(memoryStream).ReadToEnd());

memoryStream.Position = 0;
await memoryStream.CopyToAsync(responseStream);
}
}
finally
{
context.Response.Body = responseStream;
}
}
個人的には、いろんなとこで必要になりそうなので、これだけ専用のミドルウェアに抜き出してしまった方がよいと思う。そうすれば以後使う側は何も意識する必要がなくなるので(ミドルウェア実装例ボディ参照例)。

ただ、MemoryStream に一度保存するという事は、巨大なレスポンスボディが有ったりするとメモリ使用量が危なそう。
本番環境で使用する場合はご注意くださいm(__)m
スポンサーサイト



Tag: ASP.NET .NET

0 Comments

Leave a comment