Come posso impostare un proxy HTTP (WebProxy) su un proxy del servizio lato client WCF?

Come posso impostare il proxy HTTP a livello di codice, su un client WCF, senza utilizzare il proxy predefinito?

Proxy, proxy, proxy.

In base al modello di sviluppo WCF, vengono generate classi “proxy” sul lato client eseguendo svcutil.exe sul WSDL per il servizio. (Questo produce anche un file di configurazione sul lato client).

Nel mio codice ho rinnovato un’istanza di quella class e posso connettermi al servizio. Molto bella.

var svcProxy = new MyWebService(); svcProxy.GetInformation(request); 

Chiamiamo questa cosa una class proxy, ma esiste un altro proxy: il proxy http. Questo servizio utilizza wsHttpBinding basicHttpBinding, quindi sta andando su http. Ora, supponiamo di voler connettere il client al servizio web su un proxy http (modellato da un System.Net.WebProxy nel BCL .NET). Conosco la mia ampia e piacevole esperienza nella lettura della documentazione di .NET e WCF, che il runtime di WCF, se non diversamente specificato, userà il proxy di sistema predefinito quando comunicheremo tramite http / https.

Posso impostarlo dalla riga di comando in WinXP / 2003 con ProxyCfg.exe come descritto qui , e nelle versioni successive di Windows con netsh.exe come descritto qui .

È inoltre ansible specificare il proxy Web predefinito da utilizzare all’interno dell’applicazione impostando la proprietà System.Net.WebRequest.DefaultWebProxy .

Ma supponiamo che voglio connettermi tramite un proxy diverso dal proxy a livello di sistema? Ad esempio, forse non esiste un proxy a livello di sistema, ma ho bisogno di usarne uno per il servizio web in particolare. O forse c’è un proxy a livello di sistema, ma ho bisogno di usarne uno diverso, per il servizio web. E infatti forse ci sono più client di servizi Web e ognuno dovrebbe ottenere un proxy diverso.

Come si può impostare il proxy per-binding?

Nel modello ASMX, potrei fare questo:

 var svcProxy = new MyWebService(); svcProxy.Proxy = new System.Net.WebProxy("http://proxyserver:1234", true); svcProxy.GetInformation(request); 

Ma questo non è ansible con WCF; le classi proxy lato client generate da WCF non espongono una proprietà Proxy. Come si imposta il proxy http, per proxy lato client e come si imposta l’autenticazione anche sul proxy http?

Relazionato:
– how-to-set-proxy-with-credentials-to-generated-wcf-client

Le impostazioni del proxy fanno parte della configurazione di binding. Ad esempio, esaminare la proprietà ProxyAddress degli elementi di classi / configurazione BasicHTTPBinding e WSHttpBinding .

Sembra che tu stia lasciando la configurazione del tuo endpoint nel file app.config, nel qual caso dovresti essere in grado di impostare lì l’indirizzo.

Ha senso che non ci sia alcuna proprietà Proxy sul proxy WCF, perché non tutti i proxy WCF usano HTTP per la comunicazione. Dopo un’ulteriore revisione, ho scoperto che è ansible impostare il proxy in WCF a livello di codice, se il proxy WCF utilizza un binding HTTP. Lo sto documentando qui nel caso in cui qualcun altro ne abbia bisogno. Per impostare il proxy HTTP nel codice per un client WCF, procedere come segue:

 // instantiate a proxy for the service var svc= new ServiceClient(); // get the HTTP binding var b = svc.Endpoint.Binding as System.ServiceModel.BasicHttpBinding; b.ProxyAddress = new Uri("http://127.0.0.1:8888"); b.BypassProxyOnLocal = false; b.UseDefaultWebProxy = false; 

E per impostare l’indirizzo dell’endpoint – dove raggiungere il server – nel codice, dovresti fare qualcosa di simile a questo:

 var e = svc.Endpoint; e.Address = new System.ServiceModel.EndpointAddress( "http://remoteserver:5555/WcfXmlElement"); 

Ho avuto un problema simile, ma avevo anche bisogno di usare un nome utente e una password per il proxy che differiscono dal nome utente e dalla password usati per accedere al servizio.

Ho provato a crearlo tramite un UriBuilder, che avrebbe generato l’indirizzo proxy come ” http: // username: password @ myproxyserver / “. Sfortunatamente, il particolare proxy che stavo usando non funzionava con questa tecnica.

Quello che ho trovato dopo un ampio googling, è che è ansible modificare il proxy tramite WebRequest.DefaultProxy (proprietà statica).

Per esempio:

 WebProxy proxy = new WebProxy("http://myproxyserver",true); proxy.Credentials = new NetworkCredential("username", "password"); WebRequest.DefaultWebProxy = proxy; 

Puoi anche provare questo:

Ottieni a livello di codice qualsiasi legame che stai utilizzando, quindi imposta direttamente il proxy ad es

 var binding = new WSDualHttpBinding("WSDualHttpBinding_IMainService"); binding.ProxyAddress = new Uri("http://192.168.5.1:3128"); 

dove "WSDualHttpBinding_IMainService" è il nome dell’associazione dal file di configurazione. Inoltre devi impostare UseDefaultWebProxy=false ; altrimenti il ​​tuo proxy verrà ignorato.