HttpClient を使用して API コンシューマを構築しています。プロバイダーはコンシューマーがダイジェスト認証を使用して認証する必要があるため、以下のようなカスタム 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 の後にブレーク ポイントを追加すると、コードが返されないことがわかります。そのため、Digest 承認ヘッダーの詳細を抽出するために、応答が 401 の承認を受けていないかどうかを確認する方法がありません。従来の WebHttpRequest サポート Digest Authenticate を使用して別の API コンシューマー サイトを正常に構築したため、API プロバイダーに問題はありません。
重要な注意: コンシューマをコンソール アプリケーションとして記述するように切り替えると、うまく機能します。それで、よくわかりませんが、非同期モードで実行している場合、ASP.NET スレッドに関連する問題だと思いますか?
私がやっていることは何か間違っていますか?