我们已经编写了一个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
is false
)。我们可能会遇到第一次调用SendAsync
返回(如预期)401 响应的情况。我们生成一个合适的授权令牌并将其作为标头附加。但是第二次调用SendAsync
never 会导致任何网络流量发生。
我正在使用 MS Network Monitor 检查网络流量,它可以看到第一个请求(以及之前的几个请求,它们也使用相同的处理程序,但没有遇到相同的问题)。