1

我创建了一个消息处理程序,它将记录请求和响应。理想情况下我想

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

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

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

4

1 回答 1

0

经过几天在网上挖掘后,我终于找到了根本问题和解决方案。首先是问题:

  1. webapi 中的一切都是异步的
  2. 我的动作使用 Controller.User 反过来又调用 Thread.CurrentPrinciple
  3. 我使用 ITraceWriter 作为我的日志抽象

显然 ITraceWriter 机制中存在一个错误,即当前配置文件没有跨线程传播。因此,当我进行控制器操作时,我会失去原则。因此,我的查询返回一个空结果,而不是一个完全填充的结果。

解决方案:不要使用 ITraceWriter 来记录消息。使用内置机制会很好,但这不起作用。这是指向同一问题的链接,它提供了更多详细信息/上下文。

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

于 2012-08-11T12:29:09.567 回答