Asp.net web api httpmessagehandler-读取内容

Asp.net web api httpmessagehandler-读取内容,asp.net-web-api,Asp.net Web Api,我创建了一个消息处理程序,它将记录请求和响应。理想情况下,我想 公共类LoggingMessageHandler:DelegatingHandler { 受保护的覆盖任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken) { 日志请求(请求); 返回base.sendaync(请求,取消令牌).ContinueWith(任务=> { var response=task.Result; 对数响应(响应); 返回响应

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

公共类LoggingMessageHandler:DelegatingHandler
{
受保护的覆盖任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
日志请求(请求);
返回base.sendaync(请求,取消令牌).ContinueWith(任务=>
{
var response=task.Result;
对数响应(响应);
返回响应;
});
}
私有无效日志请求(HttpRequestMessage请求)
{
var writer=request.GetConfiguration().Services.GetTraceWriter();
var content=request.content;
(content??new StringContent(“”)。ReadAsStringAsync()。ContinueWith(x=>
{
writer.Trace(请求,“请求”,System.Web.Http.Tracing.TraceLevel.Info,t=>
{
t、 消息=x.结果;
});
});
}
专用无效日志响应(HttpResponseMessage响应)
{
var request=response.RequestMessage;
var writer=request.GetConfiguration().Services.GetTraceWriter();
var content=response.content;
(content??new StringContent(“”)。ReadAsStringAsync()。ContinueWith(x=>
{
writer.Trace(请求,“响应”,System.Web.Http.Tracing.TraceLevel.Info,t=>
{
t、 Status=response.StatusCode;
t、 消息=x.结果;
});
});
}
}
这是我的客户代码

public ActionResult Index()
{
var profile=Client.GetAsync(“供应商”).Result.EnsureSuccessStatusCode().Content.ReadAsAsync().Result;
返回视图(剖面);
}
日志记录似乎正在工作。但是,当注册这个处理程序时,我的客户机代码返回一个空对象。如果我删除这个处理程序,模型将从响应中成功读取并显示在屏幕上


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

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

  • webapi中的所有内容都是异步的
  • 我的操作使用Controller.User,后者反过来调用Thread.CurrentPrinciple
  • 我使用ITraceWriter作为日志抽象
  • 显然,ITraceWriter机制中存在一个错误,当前配置文件没有跨线程传播。因此,当我开始我的控制器动作时,我失去了原则。因此,我的查询返回一个空结果,而不是一个完全填充的结果

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


    在您的答复日期之前,我发现ITraceWriter中的错误尚未修复?