我创建了一个消息处理程序,它将记录请求和响应。理想情况下我想
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);
}
记录似乎正在运行。但是,当注册此处理程序时,我的客户端代码返回一个空对象。如果我删除此处理程序,则会从响应中成功读取模型并显示在屏幕上。
有没有办法阅读内容并在客户端上显示结果?
答案 0 :(得分:0)
显然,ITraceWriter机制中存在一个错误,即当前配置文件不会跨线程传播。因此,当我接到我的控制器动作时,我放松了原则。因此,我的查询返回一个空结果,而不是一个完全填充的结果。
解决方案:请勿使用ITraceWriter记录消息。使用内置机制本来不错,但这不起作用。这是提供更多细节/背景的同一问题的链接。