プロキシアカウントごとに独立した .NET ハンドラーを保つ
リクエストを処理中のトランスポートで WebProxy.Credentials を置き換えるのではなく、同時利用するアカウントごとに別のハンドラーを作成します。
トランスポートは、プールマネージャーの作成時に選ばれたプロキシ資格情報プロバイダーのオブジェクトを保持することがあります。後から WebProxy.Credentials を置き換えても、確実なアカウント切り替えにはなりません。
クライアントを使う前に、ルートとアカウントを一緒に作成します。
var proxy = new System.Net.WebProxy(proxyEndpoint)
{
Credentials = new System.Net.NetworkCredential(proxyUser, proxyPassword)
};
var handler = new System.Net.Http.HttpClientHandler
{
UseProxy = true,
Proxy = proxy
};
var client = new System.Net.Http.HttpClient(handler);エンドポイントと資格情報はアプリケーション構成から取得します。2 つ目の ID には別のハンドラーを作成してください。最初のハンドラーを共有する別の HttpClient は、そのポリシーも共有します。
カスタムの ICredentials プロバイダーは後続のチャレンジに応答できますが、確立済みのトンネルを別アカウントとして付け替えることはできません。非同期呼び出しの周囲で単一のグローバルなユーザー名/パスワードを割り当てると、チャレンジのタイミングとアカウントの所有権が衝突したままになります。
再利用が必要なときは、クライアントを有限個に保ちます。トランスポートを破棄する前に古い処理を排出してください。リクエストごとに新しいハンドラーを作ると接続プールが無駄になり、過去のアカウントをすべて永久に保持すると無制限に増えていきます。