2

APIへのリクエストとレスポンスをログに記録しようとしています。私は現在、httpwebresponsesとhttpwebrequestsをキャッチするdelegatingHandlerを使用しています。

ハンドラ:

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

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

コンテンツをリポジトリのデータベースに挿入しようとすると、null例外が発生します。しかし、コンテンツオブジェクトにステップスルーすると、応答が入力されます。リクエストが完了する前にデータをDBに挿入しようとしていると思います。

非同期リクエストを使用する目的が損なわれるため、待ちたくありません。リクエストが完了したときに、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 に答える