1. ホーム
  2. c#

HttpClientとプロキシの使用 - 常に407が表示される

2023-10-07 07:45:38

質問

以下はそのコードです。

 HttpClient client = null;
 HttpClientHandler httpClientHandler = new HttpClientHandler()
 {
    Proxy = new WebProxy(string.Format("{0}:{1}", proxyServerSettings.Address, 
    proxyServerSettings.Port),false),
    PreAuthenticate = true,
    UseDefaultCredentials = false,
 };


 this.httpClientHandler.Credentials = new NetworkCredential(proxyServerSettings.UserName, 
                        proxyServerSettings.Password);


 this.client = new HttpClient(this.httpClientHandler);

そして、最終的にこれを実行すると

HttpResponseMessage httpResponseMessage = this.client.PostAsync(urlToPost, new StringContent(data, Encoding.UTF8, this.mediaType)).Result;

を常に投げます。

リモートサーバーがエラーを返しました: (407) Proxy Authentication 必要です。

これは私には到底理解できません。

IE10 で設定した場合は、同じプロキシが問題なく動作します。 HttpWebRequest クラスを使用しても問題なく動作します。

どのように解決するのですか?

プロキシの認証情報を設定する場所を間違えています。

httpClientHandler.Credentialsは、プロキシサーバに与える認証情報です。 サーバに与える認証情報です。 に与える認証情報です。これらを間違えると、おそらく 401 か 403 の応答が返ってくるでしょう。

に与えられたクレデンシャルを設定する必要があります。 プロキシ を設定しないと、サーバへの接続が拒否されます。プロキシに提供する認証情報は、サーバに提供するものとは異なるかもしれません。これらを間違えると、407 応答が返されます。407 が表示されるのは、これらを全く設定しなかったからです。

// First create a proxy object
var proxy = new WebProxy
{
    Address = new Uri($"http://{proxyHost}:{proxyPort}"),
    BypassProxyOnLocal = false,
    UseDefaultCredentials = false,

    // *** These creds are given to the proxy server, not the web server ***
    Credentials = new NetworkCredential(
        userName: proxyUserName,
        password: proxyPassword)
};

// Now create a client handler which uses that proxy
var httpClientHandler = new HttpClientHandler
{
    Proxy = proxy,
};

// Omit this part if you don't need to authenticate with the web server:
if (needServerAuthentication)
{
    httpClientHandler.PreAuthenticate = true;
    httpClientHandler.UseDefaultCredentials = false;

    // *** These creds are given to the web server, not the proxy server ***
    httpClientHandler.Credentials = new NetworkCredential(
        userName: serverUserName,
        password: serverPassword);
}

// Finally, create the HTTP client object
var client = new HttpClient(handler: httpClientHandler, disposeHandler: true);