0

DelegatingHandler呼び出している REST API の認証スキームを処理する を作成しました。しかし、内部WebRequestHandlerがリクエストを停止する状況に陥っているようです。

このハンドラーが機能しなくなる可能性があることについて、ヘルプやアドバイスを探しています。

調べてみたところ、 の内部状態はわかりませんでしたWebRequestHandlerが、メッセージを送信しようとした内部をトレースすると、StartGettingResponse(からHttpClientHandler)で確認できます。

    {
        if (state.identity != null)
        {
            using (state.identity.Impersonate())
            {
                state.webRequest.BeginGetResponse(this.getResponseCallback, state);
                goto Label_0046;
            }
        }
        state.webRequest.BeginGetResponse(this.getResponseCallback, state);
    Label_0046:
        state.requestMessage.MarkRtcFlushComplete();
    }

identityですnullBeginGetResponseが呼び出されますが、GetResponseCallback(getResponseCallbackキャッシュされたデリゲートです) は呼び出されません。例外はありません。(あらゆる種類の) ネットワーク トラフィックはありません。


委任ハンドラーのコード:

if (request.Headers.Authorization == null)
{
    ClaimsIdentity ident = User == null ? null : User.Identity as ClaimsIdentity;
    if (PreAuthenticate)
    {
        var token = await GenerateAuthenticationToken(ident, guessedRealm,true);
        if (cancellationToken.IsCancellationRequested) return null;
        if (token != null)
        {
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
        }
    }
    var firstFlight = await base.SendAsync(request, cancellationToken);

    if (firstFlight.StatusCode != System.Net.HttpStatusCode.Unauthorized) return firstFlight;

    var wwwAuth = firstFlight.Headers.WwwAuthenticate;

    var bearerAuth = wwwAuth.SingleOrDefault(hv => hv.Scheme == "Bearer");

    var realmInfo = bearerAuth.Parameter;

    var realm = realmInfo.Substring(7).TrimEnd('"');

    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer",
        await GenerateAuthenticationToken(ident, realm,false)
    );
    if (cancellationToken.IsCancellationRequested) return null;
}
return await base.SendAsync(request, cancellationToken);

PreAuthenticate(エラー チェックと従わなかったパスは削除されました - を除くfalse)。SendAsyncへの最初の呼び出しが (予想どおり) 401 応答を返す状況に陥る可能性があります。適切な認証トークンを生成し、ヘッダーとして添付します。しかし、2 番目の呼び出しSendAsyncによって、ネットワーク トラフィックが発生することはありません。

私は MS Network Monitor を使用してネットワーク トラフィックをチェックしており、最初のリクエスト (および、同じハンドラーを使用しているが同じ問題は発生していないいくつかの以前のリクエスト) を確認できます。

4

1 に答える 1

0

HttpResponseMessage以前の呼び出しで返されたオブジェクトをリークしていて、それらを呼び出していなかったことが判明しDisposeました。(実際、私が示したコード スニペットでも、リークが発生していますfirstFlight)

このリークが発生していることは特に明らかではありません.1つまたは2つのリークだけで、後続のリクエストが内部的にキューに入れられますがSystem.Net.Connection、実際には送信されません(サーバーごとのHTTP接続制限を適用しているためだと思います)

于 2013-02-11T15:15:15.267 に答える