2009-05-13 17 views
7

È necessario aggiungere una funzionalità in un'applicazione (C#) che utilizzerà un servizio Web (servizio XML SOAP).Chiamare un webservice da un server proxy

Ora questa applicazione può (e soprattutto) essere utilizzata in un ambiente aziendale in cui è installato un server proxy.

Capisco che i servizi SOAP utilizzino il protocollo HTTP e quindi dovrebbero usare la porta 80, che viene normalmente mantenuta aperta. È giusto che l'applicazione possa utilizzare il servizio web senza alcuna codifica speciale o dovrò scrivere un codice speciale per rilevare le impostazioni del proxy o altri problemi che vedi?

MODIFICA: Webservice è un servizio pubblico disponibile su Internet. Non è sulla stessa rete.

risposta

6

OK. Così ho fatto alcuni esperimenti e si scopre che abbiamo bisogno di scrivere del codice per farlo funzionare da dietro il server proxy. (Anche se avrei preferito una soluzione migliore)

Così trapani in realtà verso il basso per chiedere dettagli del server proxy da utente e quindi configurare la classe di servizio proxy per server proxy come di seguito:

 
var networkCredentials = new NetworkCredential ("username", "password", "domain"); 
WebProxy myProxy = new WebProxy ("W.X.Y.Z:NN", true) {Credentials = networkCredentials}; 
var service = new iptocountry { Proxy = myProxy }; 
string result = service.FindCountryAsString ("A.B.C.D"); 

ho scritto un test classe e utilizza il servizio web gratuito IP To Country.

Utilizzando il codice precedente, è possibile che il servizio Web venga utilizzato correttamente.

+1

Non è stato possibile eseguire quanto sopra nell'elemento di configurazione ? –

+0

Ho provato a usare il codice (non il file di configurazione) ma non ha funzionato. In realtà l'applicazione che intendevo utilizzare questo servizio è un'applicazione Windows. Non è sicuro che sia importante o meno. – Hemant

-1

Se il servizio Web si trova sulla stessa rete interna del client che chiama il servizio web, non dovrebbe passare attraverso un proxy.

+0

No. Webservice è un servizio disponibile al pubblico su Internet. Non è sulla stessa rete. – Hemant

-1

Fintanto che il traffico web (porta 80) è consentito, non è necessario fare nulla di speciale. Dal punto di vista di un router/server proxy, le chiamate al servizio web sono le stesse di qualsiasi altro traffico HTTP.

10

Utilizzerà la porta 80 per impostazione predefinita e non sarà necessario eseguire ulteriori operazioni di codifica.

Se si ha bisogno di passare attraverso un proxy di qualche tipo, tutto quello che dovete fare è aggiungere il seguente al vostro web.config:

<system.net> 
    <defaultProxy> 
     <proxy proxyaddress="http://yourproxyserver:80" /> 
    </defaultProxy> 
    </system.net> 

Si potrebbe anche farlo con il codice usando questo:

WebRequest.DefaultWebProxy = new WebProxy("http://yourproxyserver:80/",true); 
5

Il codice integrato (WebClient, WCF, HttpWebRequest, ecc.) Utilizza la configurazione WinHTTP per ottenere la configurazione del proxy. Quindi tutto ciò che devi fare è configurare WinHTTP per sapere del proxy!

In XP, questo è:

proxycfg -u 

che importa le impostazioni da impostazioni del proxy di IE degli utenti (WinInet).

Su Vista/etc, si utilizza

netsh winhttp 

(e un po 'sottocomando come "importazione")

non testato, ma provate:

netsh winhttp import proxy source=ie 

Dopo di che, il codice .NET dovrebbero tutti funzionare tramite il proxy che gli usi presumibilmente sono già configurati per utilizzare IE ecc.

+1

E 'possibile fare sopra attraverso il codice? Il motivo è che l'applicazione che dovrà accedere al servizio Web è un'applicazione di Windows Form e che potrebbe essere eseguita su una serie di computer. Non è fattibile chiedere agli utenti di fare i passi precedenti. – Hemant

7

È possibile utilizzare l'impostazione predefinita da voi macchina locale:

System.Net.ServicePointManager.Expect100Continue = false; 
wsclient.Proxy= System.Net.HttpWebRequest.GetSystemWebProxy(); 
wsclient.Proxy.Credentials = CredentialCache.DefaultCredentials;  

e in app.config aggiungere questa configurazione:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.net> 
    <settings> 
     <servicePointManager expect100Continue="false" /> 
    </settings> 
    </system.net> 
</configuration> 
Problemi correlati