2017-01-04 3 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는 미들웨어 핸들러에서 설정된 오류 응답을 읽는 것을 시도. 그러나 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 사이의 관계를 찾을 수 없다고 말했듯이 Nikoshi. 마지막으로 내가 DelegatingHandler

사용

가 DelegatingHandler를 사용하여 사용자 정의 핸들러를 구현하는 것을 확인할 수 있었다.