【问题标题】:httpmessagehandler - reading contenthttpmessagehandler - 阅读内容
【发布时间】:2012-08-08 18:26:17
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: asp.net-web-api


    【解决方案1】:

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

    1. webapi 中的一切都是异步的
    2. 我的操作使用了 Controller.User,而后者又调用了 Thread.CurrentPrinciple
    3. 我使用 ITraceWriter 作为我的日志记录抽象

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

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

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

    【讨论】:

    • 我看到您的回答日期尚未修复 ITraceWriter 中的错误?
    猜你喜欢
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 2022-06-18
    相关资源
    最近更新 更多