2009-05-13 7 views
7

Je dois ajouter une fonctionnalité dans une application (C#) qui utilisera un service Web (service XML SOAP).Appel d'un service Web depuis un serveur proxy

Maintenant, cette application peut (et surtout) être utilisée dans un environnement d'entreprise qui a un serveur proxy en place. Je comprends que les services SOAP utilisent le protocole HTTP et devraient donc utiliser le port 80, qui est normalement maintenu ouvert. Est-il correct que l'application puisse utiliser le service Web sans codage spécial ou que je doive écrire un code spécial pour détecter les paramètres de proxy ou d'autres problèmes que vous voyez?

EDIT: Webservice est un service public disponible sur Internet. Ce n'est pas sur le même réseau.

Répondre

6

D'ACCORD. J'ai donc fait quelques expériences et il s'avère que nous avons besoin d'écrire du code pour le faire fonctionner derrière le serveur proxy. (Bien que j'aurais préféré une meilleure solution)

Donc il fore en fait vers le bas pour demander les détails du serveur proxy de l'utilisateur, puis configurer la classe proxy de service pour le serveur proxy comme ci-dessous:

 
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"); 

j'ai écrit un test classe et il utilise IP To Country service web gratuit.

En utilisant le code ci-dessus, je pourrais consommer le service Web avec succès.

+1

Vous n'avez pas pu faire ce qui précède dans l'élément de configuration ? –

+0

J'ai essayé d'utiliser le code (pas le fichier de configuration) mais cela n'a pas fonctionné. En fait, l'application que j'avais l'intention de consommer ce service est une application Windows. Pas vraiment sûr que ça compte ou non. – Hemant

-1

Si votre service Web se trouve sur le même réseau interne que le client appelant le service Web, il ne doit pas passer par un proxy.

+0

n ° Webservice est un service public sur Internet. Ce n'est pas sur le même réseau. – Hemant

-1

Tant que le trafic Web (port 80) est autorisé, vous ne devez rien faire de spécial. Les appels de service Web en perspective d'un routeur/serveur proxy sont les mêmes que pour tout autre trafic HTTP.

10

Il utilisera le port 80 par défaut, et vous ne devriez pas avoir besoin de coder davantage.

Si vous avez besoin de passer par un proxy de quelque sorte, tout ce que vous devez faire est d'ajouter ce qui suit à votre web.config:

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

Vous pouvez aussi le faire par le code en utilisant ceci:

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

Le code intégré (WebClient, WCF, HttpWebRequest, etc.) utilise tous la configuration WinHTTP pour obtenir la configuration du proxy. Donc, tout ce que vous avez à faire est de configurer WinHTTP pour connaître le proxy!

Dans XP, c'est:

proxycfg -u 

qui importe les paramètres de paramètres de proxy IE de l'utilisateur (WinInet).

Sur Vista/etc, vous utilisez

netsh winhttp 

(et certains sous-comme "l'importation")

non testé, mais essayer:

netsh winhttp import proxy source=ie 

Après cela, votre code .NET devrait tous fonctionner via le proxy que les utilisations a vraisemblablement déjà configuré afin d'utiliser IE, etc.

+1

Est-il possible de faire ci-dessus à travers le code? La raison en est que l'application qui aura besoin d'accéder au service Web est une application de formulaire Windows qui peut s'exécuter sur une série d'ordinateurs. Il n'est pas possible de demander aux utilisateurs de prendre les mesures ci-dessus. – Hemant

7

Vous pouvez utiliser le paramètre par défaut de votre machine locale:

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

et app.config ajouter cette configuration:

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