httpmessagehandler - 阅读内容

时间:2012-08-08 18:26:17

标签: asp.net-web-api

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

  1. webapi中的所有内容都是异步
  2. 我的动作使用Controller.User,而Controller.User又调用Thread.CurrentPrinciple
  3. 我正在使用ITraceWriter作为我的日志记录抽象
  4. 显然,ITraceWriter机制中存在一个错误,即当前配置文件不会跨线程传播。因此,当我接到我的控制器动作时,我放松了原则。因此,我的查询返回一个空结果,而不是一个完全填充的结果。

    解决方案:请勿使用ITraceWriter记录消息。使用内置机制本来不错,但这不起作用。这是提供更多细节/背景的同一问题的链接。

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