web-dev-qa-db-fra.com

Comment puis-je définir un proxy HTTP (WebProxy) sur un proxy de service côté client WCF?

Comment puis-je définir le proxy HTTP par programme, sur un client WCF, sans utiliser le proxy par défaut?

Procurations, procurations, procurations.

Selon le modèle de développement WCF, je génère des classes "proxy" côté client en exécutant svcutil.exe sur le WSDL pour le service. (Cela produit également un fichier de configuration côté client).

Dans mon code, je crée une instance de cette classe et je peux me connecter au service. Très agréable.

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

Nous appelons cette chose une classe proxy, mais il existe un autre proxy - le proxy http. Ce service utilise wsHttpBinding basicHttpBinding, il passe donc par http. Supposons maintenant que je souhaite connecter le client au service Web via un proxy http (modélisé par un System.Net.WebProxy dans le .NET BCL). Je sais de ma longue et délicieuse expérience de lecture de la documentation .NET et WCF, que le runtime WCF, sauf indication contraire, utilisera le proxy système par défaut lors de la communication via http/https.

Je peux définir cela à partir de la ligne de commande dans WinXP/2003 avec ProxyCfg.exe comme décrit ici , et dans les versions ultérieures de Windows avec netsh.exe comme décrit ici .

Je peux également spécifier le proxy Web par défaut à utiliser dans l'application en définissant la propriété System.Net.WebRequest.DefaultWebProxy .

Mais supposons que je veuille me connecter via un proxy différent du proxy à l'échelle du système? Par exemple, il n'y a peut-être pas de proxy à l'échelle du système, mais je dois en utiliser un pour le service Web en particulier. Ou peut-être existe-t-il un proxy à l'échelle du système, mais je dois en utiliser un autre pour le service Web. Et en fait, il existe peut-être plusieurs clients de services Web et chacun devrait obtenir un proxy différent.

Comment définir le proxy par liaison?

Dans le modèle ASMX, je pouvais faire ceci:

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

Mais ce n'est pas possible avec WCF; les classes proxy côté client générées par WCF n'exposent pas de propriété proxy. Comment définir le proxy http, par proxy côté client, et comment définir également l'authentification sur le proxy http?

En relation:
- comment définir un proxy avec des informations d'identification sur un client wcf généré

45
Cheeso

Les paramètres de proxy font partie de la configuration de liaison. Par exemple, examinez la propriété ProxyAddress des classes/éléments de configuration BasicHTTPBinding et WSHttpBinding .

Il semble que vous laissiez votre configuration de point de terminaison dans le fichier app.config, auquel cas vous devriez pouvoir y définir l'adresse.

25
tomasr

Il est logique qu'il n'y ait pas de propriété proxy sur le proxy WCF, car tous les proxy WCF n'utilisent pas HTTP pour la communication. Après un examen plus approfondi, j'ai constaté qu'il est possible de définir le proxy dans WCF par programme, si le proxy WCF utilise une liaison HTTP. Je le documente ici au cas où quelqu'un d'autre en aurait besoin. Pour définir le proxy HTTP dans le code d'un client WCF, procédez comme suit:

// 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;

Et pour définir l'adresse du point de terminaison - où atteindre le serveur - dans le code, vous feriez quelque chose comme ceci:

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

J'ai eu un problème similaire, mais j'ai également dû utiliser un nom d'utilisateur et un mot de passe pour le proxy qui diffèrent du nom d'utilisateur et du mot de passe utilisés pour accéder au service.

J'ai essayé de le construire via un UriBuilder, qui produirait l'adresse proxy comme " http: // username: password @ myproxyserver / ". Malheureusement, le proxy particulier que j'utilisais ne fonctionnait pas avec cette technique.

Ce que j'ai trouvé après une longue recherche sur Google, c'est que vous pouvez changer le proxy via WebRequest.DefaultProxy (propriété statique).

Par exemple:

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

Vous pouvez également essayer ceci:

Obtenez par programme la liaison que vous utilisez, puis définissez le proxy directement, par exemple.

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

"WSDualHttpBinding_IMainService" est le nom de votre liaison à partir de votre fichier de configuration. Vous devez également définir UseDefaultWebProxy=false; sinon votre proxy sera ignoré.

3
Layinka