2017-01-04 2 views
0
public class ErrorHandler : DelegatingHandler 
{ 
    async protected override Task<HttpResponseMessage> SendAsync(
      HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     HttpResponseMessage response = await base.SendAsync(request, cancellationToken); 
     switch (response.StatusCode) 
     { 
      case HttpStatusCode.InternalServerError: 
       var error = await response.Content.ReadAsAsync<HttpError>(); 
       response.StatusCode = HttpStatusCode.InternalServerError; 
       response.Content = new StringContent(ErrorTypeMessage.InternalServerError.ToString() + error["ExceptionMessage"] + " | " + error["StackTrace"], System.Text.Encoding.UTF8, "text/plain"); 
       ; break; 
     } 
     return response; 
    } 
} 

私はハンドラを使用してエラーを処理し、カスタムミドルウェアを使用して次のようにエラーを記録します。IOwinResponseが空です

public sealed class MyLogger : OwinMiddleware 
{ 

    public MyLogger(OwinMiddleware next) 
     : base(next) 
    { 
    } 

    public override async Task Invoke(IOwinContext context) 
    { 
     var record = new ApiEntry 
     { 
      CallerIdentity = identity 
     }; 

     await Task.Run(() => 
     { 
      record.Request = new StreamReader(context.Request.Body).ReadToEnd(); 

      byte[] requestData = Encoding.UTF8.GetBytes(record.Request); 
      context.Request.Body = new MemoryStream(requestData); 
     }); 

     await Next.Invoke(context); 

     using (var buffer = new MemoryStream()) 
     { 
      var stream = context.Response.Body; 
      context.Response.Body = buffer; 

      buffer.Seek(0, SeekOrigin.Begin); 
      using (var bufferReader = new StreamReader(buffer)) 
      { 
       record.Response = await bufferReader.ReadToEndAsync(); 
       buffer.Seek(0, SeekOrigin.Begin); 
       await buffer.CopyToAsync(stream); 
       context.Response.Body = stream; 
      } 
     } 

     //Record ApiEntry to a file as xml 

    } 

}

Iは、ミドルウェアからハンドラに設定されたエラー応答を読み取ろうとmです。しかし、record.Responseは空です。ミドルウェア内のhttpResponseMessageにアクセスすることはできますか?それを簡単に行う方法はありますか?

+0

これは、パイプラインへの途中で応答にアクセスしようとしているためです。途中ではありません。パイプラインを通してコンテキストを渡し、途中でそれにアクセスする必要があります。応答にアクセスする前に 'await Next.Invoke(context);'を追加してください。 – Nkosi

+0

申し訳ありませんミドルウェア内でこのコードの前にすでに追加しました( 'await Next.Invoke(context);')。 **ハンドラで設定されたステータスコードを読むことができます**しかし、メッセージではなく、私はIOwinResponseの中でボディを取得したいと思います。 IOwinResponseの中で 'HttpResponseMessage'に設定して読めるかどうかはわかりません。私は良い考えがありません。どのように 'HttpResponseMessage'と' IOwinResponse'が関係していますか? –

+0

'HttpResponseMessageとIOwinResponseはどのように関係していますか? ' – Nkosi

答えて

0

おかげさまで、HttpResponseMessageとIOwinResponseの関係も見つけられませんでした。最後に、私はDelegatingHandler

使用

がDelegatingHandlerを使用してカスタムハンドラを実装することを解決することができました。