2010-01-25 11 views
8

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.

risposta

2

Penso che dovrò cancellare questa domanda. Il mio codice pubblicato originale sembra funzionare a volte. Il nostro server proxy è estremamente inaffidabile; un minuto bloccherà una connessione internet da qualsiasi software, e il prossimo lo consentirà. I tecnici IT sembrano impotenti a fare qualcosa al riguardo e noi (tutti al di fuori del dipartimento IT) non abbiamo l'autorità di apportare modifiche all'infrastruttura di rete.

Se qualcuno ha qualche idea su come "indurire" il mio codice per compensare un server proxy inaffidabile, allora sarei interessato a sentirli. :-)

+0

questo è esattamente ciò che accade nel mio caso. Qualche volta sono in grado di connettermi senza questo errore. –

+3

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

9

Hai provato a impostare il proxy in app.config?

Per disabilitare il proxy, nel file App.config aggiungere la seguente configurazione

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

Per abilitare il proxy e di utilizzare le impostazioni del proxy di default (specificato nel IE) aggiungere questa configurazione nel proprio App.config

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

L'ho provato e ho ottenuto gli stessi risultati. Funziona bene per gli indirizzi HTTP, ma non riesce per HTTPS. –

0

c'è qualcosa di sbagliato con il certificato del server proxy? Se il tuo servizio non può stabilire HTTPS, genererà un errore.

+0

Ho chiesto ai nostri amministratori IT su questo, e dicono che è sicuramente configurato per supportare SSL. Hanno navigato con successo su un sito Web HTTPS tramite il server proxy. –

3

ho avuto una situazione simile

Forse avete notato che ha funzionato quando si accede a Internet prima di eseguire il codice? e se non avessi avuto accesso a Internet per anni (20 minuti per me) hai avuto l'errore.

hai provato a impostare le credenziali del proxy direttamente?

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

Recentemente, blogged su questo.

Spero che questo risolva anche il problema!

+0

Ciao Dbones, grazie per aver condiviso la tua esperienza! Sfortunatamente ho notato che il server proxy non funzionava all'improvviso anche dopo che alcune connessioni riuscite erano state fatte solo pochi secondi prima. Inoltre, ho effettivamente provato quel metodo esatto per definire il proxy nel codice e non ha fatto alcuna differenza. –

+0

wow, odio dire, ma sopra ho risolto il mio problema. Spero che tu possa trovare una soluzione per la tua situazione – dbones

Problemi correlati