1

リクエストとレスポンスをログに記録するメッセージ ハンドラを作成しました。理想的にはしたい

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

ロギングは機能しているようです。ただし、このハンドラーが登録されると、クライアント コードは空のオブジェクトを返します。このハンドラーを削除すると、モデルが応答から正常に読み取られ、画面に表示されます。

コンテンツを読み取り、結果をクライアントに表示する方法はありますか?

4

1 に答える 1

0

ネットを掘り下げてさらに数日後、私はついに根本的な問題と解決策を見つけました。最初の問題:

  1. webapiのすべてが非同期です
  2. 私のアクションはController.Userを使用し、Controller.UserはThread.CurrentPrincipleを呼び出しています
  3. ロギングの抽象化としてITraceWriterを使用しています

明らかに、現在のプロファイルがスレッド間で伝播されないITraceWriterメカニズムにバグがあります。したがって、コントローラーのアクションに到達すると、原則が失われます。したがって、私のクエリは、完全に入力された結果ではなく、空の結果を返します。

解決策:メッセージのログにITraceWriterを使用しないでください。組み込みのメカニズムを使用するのが良かったのですが、それは機能しません。これは、より詳細/コンテキストを提供する同じ問題へのリンクです。

https://aspnetwebstack.codeplex.com/workitem/237

于 2012-08-11T12:29:09.567 に答える