開発者は、プロキシの構成や、HttpClientをプールする ASP.NET Coreの効率的な方法の使用など、HttpClient インスタンスをきめ細かく制御する必要がある場合があります。
HttpClientFactory で回復性のある HTTP 要求ドキュメントを実装する方法の詳細を確認できます。
HttpClientをカスタマイズするには、開発者がIMsalHttpClientFactoryを実装する必要があります。この場合、MSAL は各 HTTP 要求のHttpClientを取得するために使用します。
IMsalHttpClientFactory の実装ガイドライン
- ASP.NET CoreのSystem.Net.Http.HttpClientなど、このインターフェイスに適合できるスケーラブルな
IHttpClientFactory例については、を参照してください。 - 実装はスレッド セーフである必要があります。
-
HttpClientに新しいGetHttpClientを作成しないでください。これによりポートが枯渇します。 - MSAL は、
Dispose()でHttpClientを呼び出しません。 - アプリで統合Windows認証を使用している場合は、System.Net.Http.HttpClientHandler.UseDefaultCredentialsが
trueに設定されていることを確認します。
実装例
IMsalHttpClientFactory httpClientFactory = new MyHttpClientFactory();
var pca = ConfidentialClientApplication.Create("client_id")
.WithHttpClientFactory(httpClientFactory)
.Build();
IMsalHttpClientFactory の簡単な実装
public class StaticClientWithProxyFactory : IMsalHttpClientFactory
{
private static readonly HttpClient s_httpClient;
static StaticClientWithProxyFactory()
{
var webProxy = new WebProxy(
new Uri("http://my.proxy"),
BypassOnLocal: false);
webProxy.Credentials = new NetworkCredential("user", "pass");
var proxyHttpClientHandler = new HttpClientHandler
{
Proxy = webProxy,
UseProxy = true,
};
s_httpClient = new HttpClient(proxyHttpClientHandler);
}
public HttpClient GetHttpClient()
{
return s_httpClient;
}
}
HttpClient と Xamarin iOS
Xamarin iOS を使用する場合は、iOS 7 以降のHttpClient ベースのハンドラーを明示的に使用するNSURLSessionを作成することをお勧めします。 MSAL.NET は、iOS 7 以降では NSURLSessionHandler を使用する HttpClient を自動的に作成します。 詳細については、httpClient の Xamarin iOS ドキュメントを参照してください。
Troubleshooting
問題: デスクトップ アプリケーションでは、承認エクスペリエンスで定義した HttpClient が使用されない
解決方法:
デスクトップ アプリとモバイル アプリでは、MSAL によってブラウザーが開き、承認 URL に移動します。 組み込みブラウザーを使用する場合は、HttpClient を使用しません。次の手法に従ってプロキシを制御できます。https://blogs.msdn.microsoft.com/jpsanders/2011/04/26/how-to-set-the-proxy-for-the-webbrowser-control-in-net/これは、システム ブラウザーのみが使用できる .NET Core では作成できません。 MSAL は、システム ブラウザーを制御しません。
問題: ブラウザーがプロキシに接続できますが、MSAL から HTTP 407 エラーが発生する
解決策: HTTP 407 にプロキシ認証の問題が表示されます。 .NET フレームワークでは、IE のプロキシ設定が使用されます。既定では、"UseDefaultCredential" 設定は含まれません。 一部のユーザーは、.config ファイルに以下を追加して、この問題の修正を報告しています。
<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true" />
</system.net>