我正在使用 HttpClient 构建 API 使用者。因为提供者要求消费者使用 Digest Authentication 进行身份验证,所以我需要编写一个自定义 DelegatingHandler,如下所示:
public class DigestAuthDelegatingHandler : DelegatingHandler
{
public DigestAuthDelegatingHandler(HttpMessageHandler innerHandler) : base(innerHandler) { }
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var response = await base.SendAsync(request, cancellationToken);
if (!response.IsSuccessStatusCode && response.StatusCode == HttpStatusCode.Unauthorized)//This line of code is never reached
{
//Generate the Digest Authorization header string and add to the request header,
//then try to resend the request to the API provider
}
return response;
}
}
我创建一个 HttpClient 并将我的自定义 DelegatingHandler 添加到消息处理程序 pineline
HttpClient httpClient = new HttpClient(new DigestAuthDelegatingHandler(new HttpClientHandler()));
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpClient.BaseAddress = new Uri("http://127.0.0.1/");
HttpResponseMessage response = httpClient.GetAsync("api/getTransactionInfo?TransactionNumber=1000).Result;
这样做之后,我的消费者看起来就像永远运行。当我在上面的代码行 await base.SendAsync 之后添加断点时,我看到代码永远不会返回,因此我无法检查响应是否获得 401 未授权以提取摘要授权标头详细信息。API 提供者没有任何问题,因为我已经使用传统的 WebHttpRequest 支持 Digest Authenticate 成功构建了另一个 API 消费者站点,并且它运行良好。
重要提示:如果我切换到将消费者编写为控制台应用程序,那么它运行良好。所以,我不确定,但我认为这是在异步模式下运行时与 ASP.NET 线程有关的问题?
我做错了什么吗?