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
ですnull
。BeginGetResponse
が呼び出されますが、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 を使用してネットワーク トラフィックをチェックしており、最初のリクエスト (および、同じハンドラーを使用しているが同じ問題は発生していないいくつかの以前のリクエスト) を確認できます。