httpmessagehandler - 阅读内容(httpmessagehandler - re

2019-10-17 03:39发布

我创建一个消息处理程序,其将记录请求和响应。 最好我想

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);
}

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

有没有办法阅读的内容,并显示在客户端上的结果?

Answer 1:

几天上网上周围挖后,我终于找到了问题的根源和解决方案。 首先的问题:

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

显然没有在ITraceWriter mechanicism在当前配置文件没有在线程之间传播的错误。 因此,我失去了原则,当我得到我的控制器操作。 因此,我的查询将返回一个空的结果,而不是完全填充的结果。

解决办法:不要使用ITraceWriter来记录消息。 这本来是很好的使用内置的机制,但是,这并不工作。 这里是链接到提供更详细/背景相同的问题。

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



文章来源: httpmessagehandler - reading content