2017-06-12 7 views
2

私の要件:他の後続のミドルウェア(Mvcなど)からの応答からすべての「悪い言葉」をフィルタリングするミドルウェアを作成します。ミドルウェアの応答を変更する

問題:応答のストリーミング。だからすでに応答に書いてある後続のミドルウェアから私たちがFilterBadWordsMiddlewareに戻ったときに、応答が既に送信を開始しており、これは良く知られているエラーにつながるので、response has already started ...

それで、これは多くのさまざまな状況での要件なので、それに対処する方法は?

答えて

4

応答ストリームを送信しないように、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); 
    } 
} 

これは回避策であり、パフォーマンスの問題を引き起こす可能性があります。私はここでより良い解決策を見ていきたいと考えています。

+0

ありがとうございます!私は、 'context.Response.OnStarting()'にコールバックを付けることによっても動作するが、応答を変更するときには機能しないことが分かった。また、私は 'OnStarting()'を使うのが好きではありません。なぜなら、それは反復的なミドルウェアワークフローを壊すからです。 – Matthias

関連する問題