2

我正在尝试记录对 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;
             });
    }

日志响应:

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

当我尝试将内容插入到我的存储库中的数据库时,我得到一个空异常。但是当我单步执行内容对象时,它会填充响应。我想我正在尝试在请求完成之前将数据插入数据库。

我不想等待它,因为这违背了使用异步请求的目的,当请求完成时,我如何连接它以运行 logresponse 方法?我认为 continueWith 会解决这个问题并在任务完成时运行该操作(这是否意味着请求的下载不一定完成?)。

有任何想法吗?

4

3 回答 3

6

您正在info.Content异步设置对_repository.LogResponse(info). LogResponse甚至可能在继续执行之前调用。将您的呼叫移动到LogResponse延续的主体内。例如:

if (response.Content != null)
{
    response.Content.ReadAsStringAsync().ContinueWith((task) =>
            { 
                info.Content = task.Result;
                _repository.LogResponse(info);
            }
        );
}
于 2012-05-15T20:47:38.220 回答
0
if (response.Content != null)
{
    var task = response.Content.ReadAsStringAsync().ContinueWith((task) =>
                       { 
                           info.Content = task.Result;
                       });

    task.Wait();
}

_repository.LogResponse(info);
于 2012-05-15T20:52:36.237 回答
0

你可以试试这个例子:

private void LogResponse(HttpResponseMessage response)
{
    ApiResponse info = new ApiResponse();
    //Populate response obj   

    if (response.Content != null)
    {
        var info = await response.Content.ReadAsStringAsync();
        _repository.LogResponse(info);
    }
}
于 2012-05-15T20:56:14.277 回答