Sto lavorando a un'applicazione .NET che chiama servizi Web di terzi su Internet. I servizi non utilizzano SOAP, quindi costruiamo manualmente un documento di richiesta XML, lo inviamo al servizio via HTTP e recuperiamo una risposta XML.Errore di autenticazione proxy 407 HTTP durante la chiamata a un servizio Web
Il nostro codice è un servizio di Windows che viene eseguito nel contesto di un normale account di dominio di Windows e si trova dietro un server proxy (Microsoft ISA Server) configurato per richiedere l'autenticazione NTLM. L'account che esegue il nostro servizio ha il permesso di accedere a Internet tramite il server proxy.
Il codice simile a questo:
// 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);
}
}
Questo funziona bene se il server proxy è spento, oppure l'URL è stato whitelist non richiede l'autenticazione, ma non appena l'autenticazione è attiva, non riesce sempre con un errore HTTP 407.
Ho inserito il codice precedente in un'imbracatura di test e ho provato ogni metodo possibile per la configurazione della proprietà request.Proxy
, senza esito positivo.
Ho quindi notato che tutti i servizi Web di terze parti che dobbiamo chiamare sono HTTPS. Quando ho provato ad accedervi come HTTP, invece, l'autenticazione proxy ha iniziato a funzionare. C'è qualche cerchio in più che devo passare per ottenere l'autenticazione proxy e HTTPS per giocare bene?
PS: Gli stessi problemi si verificano con il server proxy SmoothWall open source, quindi non posso semplicemente scriverlo come un bug in ISA Server.
PPS: Sono consapevole del fatto che è possibile configurare le impostazioni proxy in app.config
, ma (a) facendo in codice non dovrebbe fare alcuna differenza, e (b) la progettazione delle applicazioni richiede che leggiamo le impostazioni proxy da un database in fase di esecuzione.
questo è esattamente ciò che accade nel mio caso. Qualche volta sono in grado di connettermi senza questo errore. –
Segnalazione come suggerimento per la risoluzione dei problemi per coloro che passeggiano su questo: Potrebbe essere il software/software di configurazione del server proxy, ma il primo controllo di problemi intermittenti come questo è l'eliminazione del fallimento del cluster parziale. Se ci sono più server proxy dietro un sistema di bilanciamento del carico, e solo uno è configurato correttamente, passerai solo se bilanciato con l'istanza "buona", ovvero. a volte. – Barryrowe