応答ストリームを送信しないように、MemoryStream
に置き換えます。応答が変更された後の元のストリームを返します。
public class EditResponseMiddleware
{
private readonly RequestDelegate _next;
public EditResponseMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
var originBody = context.Response.Body;
var newBody = new MemoryStream();
context.Response.Body = newBody;
await _next(context);
newBody.Seek(0, SeekOrigin.Begin);
string json = new StreamReader(newBody).ReadToEnd();
context.Response.Body = originBody;
await context.Response.WriteAsync(modifiedJson);
}
}
これは回避策であり、パフォーマンスの問題を引き起こす可能性があります。私はここでより良い解決策を見ていきたいと考えています。
ありがとうございます!私は、 'context.Response.OnStarting()'にコールバックを付けることによっても動作するが、応答を変更するときには機能しないことが分かった。また、私は 'OnStarting()'を使うのが好きではありません。なぜなら、それは反復的なミドルウェアワークフローを壊すからです。 – Matthias