2012-08-08 137 views
1

我创建了一个消息处理程序,它将记录请求和响应。最好我想httpmessagehandler - 阅读内容

public class LoggingMessageHandler : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     LogRequest(request); 

     return base.SendAsync(request, cancellationToken).ContinueWith(task => 
     { 
      var response = task.Result; 

      LogResponse(response); 

      return response; 
     }); 
    } 

    private void LogRequest(HttpRequestMessage request) 
    { 
     var writer = request.GetConfiguration().Services.GetTraceWriter(); 
     var content = request.Content; 

     (content ?? new StringContent("")).ReadAsStringAsync().ContinueWith(x => 
     { 
      writer.Trace(request, "request", System.Web.Http.Tracing.TraceLevel.Info, t => 
      { 
       t.Message = x.Result; 
      }); 
     }); 
    } 

    private void LogResponse(HttpResponseMessage response) 
    { 
     var request = response.RequestMessage; 
     var writer = request.GetConfiguration().Services.GetTraceWriter(); 
     var content = response.Content; 

     (content ?? new StringContent("")).ReadAsStringAsync().ContinueWith(x => 
     { 
      writer.Trace(request, "response", System.Web.Http.Tracing.TraceLevel.Info, t => 
      { 
       t.Status = response.StatusCode; 
       t.Message = x.Result; 
      }); 
     }); 
    } 
} 

,这里是我的客户端代码。

public ActionResult Index() 
{ 
    var profile = Client.GetAsync("Vendor").Result.EnsureSuccessStatusCode().Content.ReadAsAsync<VendorProfileModel>().Result; 
    return View(profile); 
} 

记录似乎正在工作。但是,当这个处理程序注册时,我的客户端代码返回一个空对象。如果我删除这个处理程序,那么模型将成功从响应中读取并显示在屏幕上。

有没有办法读取内容并在客户端显示结果?

回答

0

在网上搜索几天后,我终于找到根本问题和解决方案。第一问题:

  1. 一切的WebAPI是异步
  2. 我的操作使用Controller.User这又是哪位Thread.CurrentPrinciple
  3. 我使用ITraceWriter我的日志抽象

明显ITraceWriter机制中存在一个错误,当前的配置文件不会跨线程传播。因此,当我达到我的控制器操作时,我放弃了原则。因此,我的查询返回一个空的结果,而不是一个完全填充的结果。

解决方案:请勿使用ITraceWriter记录消息。使用内置的机制本来是很好的,但这不起作用。这里是提供更多细节/上下文的相同问题的链接。

https://aspnetwebstack.codeplex.com/workitem/237

+0

我通过在ITraceWriter的bug一直没有动你的答案的日期见? – Orlin 2013-07-05 21:33:01