2012-01-17 9 views
6

Sto provando a chiamare un webservice. Devo usare un proxy che usa uno script WPAD. L'URL di questo script WPAD è diverso per le diverse distribuzioni dell'applicazione.Uso dinamico di un WebProxy con script WPAD

Sebbene IE abbia le corrette impostazioni di proxy, l'applicazione è in esecuzione come servizio di Windows in esecuzione in account Sistema locale, quindi l'applicazione non conosce le impostazioni IE per questo utente di Windows.

Mettere quanto segue in app.config funziona:

<system.net> 
    <defaultProxy enabled="true" useDefaultCredentials="true" > 
     <proxy autoDetect="True" scriptLocation="http://url.to/wpad.dat"/> 
    </defaultProxy> 
</system.net> 

Ma questo ha la limitazione che non può essere configurato dall'utente. C'è un modo per fare dinamicamente quanto sopra dal codice (C# -)? Sospetto anche che quanto sopra cambierà il comportamento dei servizi web che non dovrebbero passare attraverso un proxy (ma non l'ho verificato).

A http://msdn.microsoft.com/en-us/library/system.net.webproxy.aspx ho trovato il testo utile: "(Per un esempio che dimostra utilizzando la funzione WPAD, vedere la documentazione per la classe IWebProxyScript.)" Ma non hanno trovato l'esempio :(

risposta

1

questo articolo. il codice di progetto mostra come utilizzare le API di Windows per eseguire lo script PAC e restituire i dati corretti proxy per un determinato URL: http://www.codeproject.com/Articles/12168/Using-PAC-files-proxy

È possibile utilizzare la funzione per scoprire i dettagli del proxy, e quindi configurare gli oggetti del servizio web proxy direttamente o modifica WebRequest.DefaultProxy

+0

Ho trovato qualcosa di simile qui: [link] (http://www.pcreview.co.uk/forums/winhttpgetproxyforurl-t1862181.html) ma i WPAD possono restituire diversi server proxy (failover e/o bilanciamento del carico, vedere [ link] (http://en.wikipedia.org/wiki/Proxy_auto-config)). Quindi li restituisce separati da punto e virgola. Le voci che ritornano "DIRECT" sembrano scomparire con questo metodo. Quindi anche se questo è un passo nella giusta direzione, non mi sembra completo. –

+0

Non potresti usare string.split sul valore di ritorno per ottenere un elenco di voci e poi provarle in sequenza, in modo predefinito di non utilizzare un proxy se l'elenco è vuoto? – sga101

+0

Questo è quello che ho finito per fare. Ma non mi piace: - Ora ho un ciclo che esegue la richiesta web per ogni proxy che trovo - Non so come gestire DIRECT. Ora non utilizzo alcun proxy se ottengo una lista vuota, ma ho visto esempi che restituiscono sia un proxy che DIRECT, quindi probabilmente non è il modo corretto di farlo. - Se il webrequest sta scadendo, non so davvero perché. Potrebbe essere il proxy, potrebbe essere qualcos'altro. Quindi ripeto la richiesta con un altro proxy. Forse un altro timeout? E l'utente aspetta ... - Davvero non voglio farlo. Voglio che il sistema operativo lo gestisca ... –

0

IWebProxyScript è utilizzato internamente da WebProxy stesso.

Se si inizializza un WebProxy con l'URL di uno script WPAD, verrà risolto l'URL corretto per le richieste che gli vengono passate. È possibile impostare tale WebProxy su WebRequest e gestirà automaticamente l'impostazione dell'URL del proxy corretto per la destinazione della richiesta.

WebRequest request = WebRequest.Create("http://targeturl"); 
request.Proxy = new WebProxy("http://url.to/wpad.dat"); 

È anche possibile ottenere l'URL proxy per un determinato obiettivo in questo modo:

WebProxy proxy = new WebProxy("http://url.to/wpad.dat");  
Uri proxyUri = proxy.GetProxy(new Uri("http://targeturl")); 

Questo non funziona per gli script PAC.