【发布时间】:2012-08-19 15:11:31
【问题描述】:
当尝试在控制器中的操作中的对象时,它偶尔似乎为空。我发现这是由于SendAsync() 覆盖DelegatingHandler 中的ReadAsStringAsync()。问题在于内容。当我的客户端发送内容主体并在记录器中读取它时,控制器操作调用者永远不会读取它(或者可能在JsonFormatter 中的某处)。我怀疑随后对Content.ReadAsStringAsync() 的调用不会引发异常,但也不会返回预期的内容主体(返回一些信息,说明异步读取已完成)。
但我的问题仍然存在,因为我想在操作中读取 [FromBody] 参数,并且当 Content.ReadStringAsync 的 RaceCondition 被 DelegatingHandler 赢得时,它为空。当JsonFormatter 获胜时,我得到了对象,但这种情况很少见(仅在服务启动时)。
这是我的DelegatingHandler 代码:
public class LogHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var apiRequest = new WebApiUsageRequest(request);
WriteLog(apiRequest);
request.Content.ReadAsStringAsync().ContinueWith(t =>
{
apiRequest.Content = t.Result;
WriteLog(apiRequest);
});
return base.SendAsync(request, cancellationToken).ContinueWith(task =>
{
var apiResponse = new WebApiUsageResponse(task.Result);
apiResponse.Content = task.Result.Content != null ? task.Result.Content.ReadAsStringAsync().Result : null;
WriteLog(apiResponse);
return task.Result;
});
}
}
有人知道这个问题的解决方法吗?
【问题讨论】:
-
忘了说这是 RC。我怀疑 RTM 中的观察结果也保持不变
标签: c# web-services rest asp.net-web-api