2010-01-25 1 views
8

Je travaille sur une application .NET qui appelle des services Web tiers via Internet. Les services n'utilisent pas SOAP, donc nous construisons manuellement un document de requête XML, l'envoyons au service via HTTP et récupérons une réponse XML.Erreur d'authentification du proxy HTTP 407 lors de l'appel d'un service Web

Notre code est un service Windows exécuté dans le contexte d'un compte de domaine Windows normal et se trouve derrière un serveur proxy (Microsoft ISA Server) configuré pour requérir l'authentification NTLM. Le compte exécutant notre service a l'autorisation d'accéder à Internet via le serveur proxy.

Le code ressemble à ceci:

// Create the request object. 
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url); 
request.Method = "POST"; 

// Configure for authenticating proxy server requiring Windows domain credentials. 
request.Proxy = New WebProxy(proxyAddress) { UseDefaultCredentials = true }; 

// Set other required headers. 
request.Accept = acceptableMimeType; 
request.Headers.Add(HttpRequestHeader.AcceptCharset, acceptableCharset); 
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "none"); 
request.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-gb"); 
request.Headers.Add(HttpRequestHeader.CacheControl, "no-store"); 
request.Headers.Add(HttpRequestHeader.ContentEncoding, "none"); 
request.Headers.Add(HttpRequestHeader.ContentLanguage, "en-gb"); 
request.ContentType = requestMimeType; 
request.ContentLength = requestBytes.Length; 

// Make the method call. 
using(Stream stream = request.GetRequestStream()) { 
    stream.Write(requestBytes, 0, requestBytes.Length); 
} 
HttpWebResponse response = (HttpWebResponse) request.GetResponse(); 

// Extract the data from the response without relying on the HTTP Content-Length header 
// (we cannot trust all providers to set it correctly). 
const int bufferSize = 1024 * 64; 
List<byte> responseBytes = new List<byte>(); 
using(Stream stream = new BufferedStream(response.GetResponseStream(), bufferSize)) { 
    int value; 
    while((value = stream.ReadByte()) != -1) { 
     responseBytes.Add((byte) value); 
    } 
} 

Cela fonctionne bien si le serveur proxy est désactivé, ou l'URL a été whitelisted comme ne nécessitant pas d'authentification, mais dès que l'authentification est actif, il échoue toujours avec une erreur HTTP 407.

J'ai mis le code ci-dessus dans un faisceau de test, et essayé toutes les méthodes que je pouvais penser pour la configuration de la propriété request.Proxy, sans succès.

J'ai alors remarqué que tous les services Web tiers que nous devons appeler sont HTTPS. Lorsque j'ai essayé d'y accéder au lieu de HTTP, l'authentification du proxy a commencé à fonctionner. Y a-t-il un cerceau supplémentaire que je dois sauter pour obtenir l'authentification du proxy et HTTPS pour bien jouer? PS: Les mêmes problèmes se produisent avec le serveur proxy open source SmoothWall, donc je ne peux pas simplement l'écrire comme un bogue dans ISA Server. PPS: Je sais que vous pouvez configurer les paramètres de proxy dans app.config, mais (a) le faire dans le code ne devrait faire aucune différence, et (b) la conception de l'application exige que nous lisions les paramètres de proxy à partir d'un base de données à l'exécution.

Répondre

2

Je pense que je vais devoir écrire cette question. Mon code posté original semble parfois fonctionner. Notre serveur proxy est extrêmement peu fiable; une minute, il bloquera une connexion Internet à partir de n'importe quel logiciel, et le prochain il le permettra. Les informaticiens semblent impuissants à faire quoi que ce soit, et nous (tout le monde à l'extérieur du département informatique) n'avons aucune autorité pour apporter des modifications à l'infrastructure réseau.

Si quelqu'un a des idées sur la façon de "durcir" mon code pour compenser un serveur proxy non fiable, alors je serais intéressé de les entendre. :-)

+0

c'est ce qui se passe exactement dans mon cas.quelque temps j'ai pu me connecter sans cette erreur. –

+3

Affichage en tant que conseil de dépannage pour ceux qui se promènent: Ceci peut être le config/logiciel du serveur proxy, mais la première vérification des problèmes intermittents comme celui-ci est l'élimination de la défaillance partielle du cluster. S'il existe plusieurs serveurs proxy derrière un programme d'équilibrage de charge et qu'un seul est correctement configuré, vous ne réussirez à passer que lorsque vous serez équilibré avec la "bonne" instance. parfois. – Barryrowe

9

Avez-vous essayé de définir le proxy dans app.config?

Pour désactiver le proxy, dans le fichier App.config ajouter la configuration suivante

<system.net> 
    <defaultProxy enabled="false" useDefaultCredentials="false"> 
    <proxy/> 
    <bypasslist/> 
    <module/> 
    </defaultProxy> 
</system.net> 

Pour activer le proxy et d'utiliser les paramètres de proxy par défaut (spécifié dans Internet Explorer) ajouter cette configuration dans votre App.config

<system.net> 
    <defaultProxy enabled="true" useDefaultCredentials="true"> 
    <proxy/> 
    <bypasslist/> 
    <module/> 
    </defaultProxy> 
</system.net> 
+1

J'ai essayé, et j'ai obtenu les mêmes résultats. Cela fonctionne correctement pour les adresses HTTP, mais échoue pour HTTPS. –

0

Y at-il un problème avec le certificat de votre serveur proxy? Si votre service ne peut pas établir HTTPS alors il va lancer une erreur.

+0

J'ai demandé à nos administrateurs informatiques à ce sujet, et ils disent qu'il est définitivement configuré pour prendre en charge SSL. Ils ont navigué avec succès sur un site Web HTTPS via le serveur proxy. –

3

J'ai eu une situation similaire

Avez-vous remarqué cela a fonctionné lorsque vous avez accédé à Internet avant d'exécuter le code? et si vous n'aviez pas accédé à internet depuis des siècles (20mins pour moi) vous avez eu l'erreur.

avez-vous essayé de définir les informations d'identification du proxy directement?

//setup the proxy 
request.Proxy = new WebProxy("proxyIp", 8080); 
request.Proxy.Credentials = CredentialCache.DefaultCredentials; 

Je récemment blogged à ce sujet.

J'espère que cela résout votre problème aussi!

+0

Salut Dbones, merci de partager votre expérience! Malheureusement, j'ai observé le serveur proxy échouer soudainement même après que des connexions réussies ont été faites seulement quelques secondes plus tôt. Aussi, j'ai effectivement essayé cette méthode exacte de définition du proxy dans le code, et cela n'a fait aucune différence. –

+0

wow, je déteste dire, mais le ci-dessus a résolu mon problème. J'espère que vous pourrez trouver une solution à votre situation – dbones

Questions connexes