web-dev-qa-db-ja.com

HttpClientおよびプロキシの使用-常に407を取得

コードは次のとおりです。

 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 Required。

私の世界ではわからない。

IE10で構成されている場合、または代わりにHttpWebRequestクラスを使用している場合、同じプロキシ設定は問題なく機能します

41
dexter

プロキシ資格情報を間違った場所に設定しています。

httpClientHandler.Credentialsは、プロキシが既に接続を確立した後にserverに与える資格情報です。これらが間違っている場合、おそらく401または403の応答が返されます。

proxyに与えられた資格情報を設定する必要があります。設定しないと、そもそもサーバーへの接続を拒否します。プロキシに提供する資格情報は、サーバーに提供する資格情報と異なる場合があります。これらが間違っていると、407応答が返されます。これらをまったく設定しないため、407を取得しています。

// First create a proxy object
var proxy = new WebProxy
{
    Address = new Uri($"http://{proxyHost}:{proxyPort}"),
    BypassOnLocal = 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);
87
Daryl

プロキシハンドラーを渡す必要があります。これを試してみてください

var handler = new HttpClientHandler();
handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials;

var client = new HttpClient(handler);

HttpResponseMessage response = await client.SendAsync();
4
Taran

これに関するいくつかの有用な情報を見つけました ここではsocial.msdn.Microsoft.comから 。応答から、私が作成したテストと System.Net.WebProxy Class を調査して、HttpClientHandlerではなくプロキシオブジェクトにプロキシ資格情報を渡す必要があります。

{
    Proxy = new WebProxy(string.Format("{0}:{1}", proxyServerSettings.Address, 
    proxyServerSettings.Port),false),
    PreAuthenticate = true,
    UseDefaultCredentials = false,
    Credentials = new System.Net.NetworkCredential(proxyServerSettings.UserName, 
                    proxyServerSettings.Password),
};

これは実際には、HttpClientHandlerではなく、プロキシへの接続を認証するためのものです。

1
Darksheao