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 

    } 

}

Я пытаюсь прочитать ответ ошибки, который был установлен в обработчике от промежуточного слоя. Но record.Response пуст. Могу ли я получить доступ к httpResponseMessage внутри промежуточного программного обеспечения или есть ли простой способ сделать это?

+0

Это потому, что вы пытаетесь получить доступ к ответу на пути в трубопровод. а не на выход. вам нужно передать контекст через конвейер и получить к нему доступ на своем пути. add 'await Next.Invoke (context);' перед попыткой получить доступ к ответу. – Nkosi

+0

Не сожалею, я добавил, что ('await Next.Invoke (context);') уже до этого кода внутри промежуточного программного обеспечения. Я могу прочитать код состояния, который установлен обработчиком **. Но не сообщение, я хочу получить тело внутри IOwinResponse. Я не знаю, могу ли я прочитать это внутри IOwinResponse, установив его в HttpResponseMessage. У меня нет хорошей идеи. Как связаны «HttpResponseMessage» и «IOwinResponse». –

+0

'Как HttpResponseMessage и IOwinResponse связаны.' Это не так. – Nkosi

ответ

0

Спасибо Nikoshi, как вы сказали, я также не смог найти связь между HttpResponseMessage и IOwinResponse. Наконец я был в состоянии решить, что с помощью

DelegatingHandler

реализовать пользовательский обработчик с помощью DelegatingHandler.