gdp*_*gdp 2 c# asynchronous task asp.net-web-api
我正在尝试记录API的请求和响应.我目前正在使用delegatingHandler捕获httpwebresponses和httpwebrequests.
处理器:
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
LogRequest(request);
return base.SendAsync(request, cancellationToken).ContinueWith((task) =>
{
HttpResponseMessage response = task.Result;
LogResponse(response);
return response;
});
}
Run Code Online (Sandbox Code Playgroud)
LogResponse:
private void LogResponse(HttpResponseMessage response)
{
ApiResponse info = new ApiResponse();
//Populate response obj
if (response.Content != null)
{
response.Content.ReadAsStringAsync().ContinueWith((task) =>
{
info.Content = task.Result;
}
);
}
_repository.LogResponse(info);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试将内容插入我的存储库中的数据库时,我得到一个null异常.但是当我逐步完成内容对象时,它会填充响应.我想我正在尝试在请求完成之前将数据插入到数据库中.
我不想等待它,因为这违背了使用异步请求的目的,如何在请求完成时将其挂钩以运行logresponse方法?我认为continueWith处理了这个并在任务完成时运行动作(这是否意味着下载请求不一定完成了?).
有任何想法吗?
您正在info.Content调用异步设置_repository.LogResponse(info). LogResponse很可能在连续执行之前调用.将你的电话转移LogResponse到续集的正文中.例如:
if (response.Content != null)
{
response.Content.ReadAsStringAsync().ContinueWith((task) =>
{
info.Content = task.Result;
_repository.LogResponse(info);
}
);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4213 次 |
| 最近记录: |