web-dev-qa-db-fra.com

HttpClient et en utilisant un proxy - obtenir constamment 407

Voici le code:

 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);

Et quand je le fais enfin:

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

Il jette toujours le

Le serveur distant a renvoyé une erreur: (407) Authentification proxy requise.

Ce que je ne comprends pas pour le monde à moi.

La même configuration de proxy fonctionne très bien quand est configuré dans IE10 ou si j'utilise plutôt la classe HttpWebRequest

41
dexter

Vous définissez les informations d'identification du proxy au mauvais endroit.

httpClientHandler.Credentials sont les informations d'identification que vous donnez au serveur après que le proxy a déjà établi une connexion. Si vous vous trompez, vous obtiendrez probablement une réponse 401 ou 403.

Vous devez définir les identifiants donnés à proxy, sinon il refusera de vous connecter au serveur. Les informations d'identification que vous fournissez au proxy peuvent être différentes de celles que vous fournissez au serveur. Si vous vous trompez, vous obtiendrez une réponse 407. Vous obtenez un 407 parce que vous ne les avez jamais réglés.

// 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

Vous devez passer un gestionnaire de proxy. essayez ça a fonctionné pour moi

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

var client = new HttpClient(handler);

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

J'ai trouvé des informations utiles à ce sujet ici de social.msdn.Microsoft.com . À partir des réponses, des tests que j'ai effectués et de la recherche dans la classe System.Net.WebProxy Class , vous devez passer les informations d'identification du proxy à l'objet proxy, et non pas le 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),
};

Ceci est en fait destiné à authentifier la connexion au proxy, pas à HttpClientHandler.

1
Darksheao