53 votes

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

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

Les procurations sollicitation de procurations.

Selon la WCF modèle de développement, je générer côté client "proxy" classes svcutil.exe sur le WSDL du service. (Cela aussi produit d'un côté client, le fichier de config).

Dans mon code j'ai du nouveau en place d'une instance de cette classe et je peux me connecter à l' service. Très agréable.

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

Nous appelons cette chose une classe proxy, mais il est un autre proxy le proxy http. Cette le service est à l'aide de wsHttpBinding basicHttpBinding, de sorte qu'il est d'aller sur le http. Maintenant, supposons que je veux me connecter le client vers le service web sur un proxy http (modélisé par un Système.Net.WebProxy dans le .NETS DE LA BCL). Je sais de mon vaste, agréable l'expérience de lecture .NET et WCF documentation, que la FMC de l'exécution, si pas d'indication contraire, va utiliser la valeur par défaut proxy du système lors de la communication via http/https.

Je peux le mettre qu'à partir de la ligne de commande dans Sous windows xp / 2003 avec ProxyCfg.exe comme décrit ici, et à plus tard les versions de Windows avec netsh.exe comme décrit ici.

Je peux aussi préciser la valeur par défaut de proxy web pour l'utilisation dans l'application en définissant le Système.Net.WebRequest.DefaultWebProxy de la propriété.

Mais supposons que je veux me connecter sur un proxy qui est différente de la à l'échelle du système de proxy? Par exemple peut-être il n'est pas à l'échelle du système de proxy mais J'ai besoin d'en utiliser une pour le service web en particulier. Ou peut-être qu'il est a l'échelle du système de proxy mais j'ai besoin d'utiliser un autre, pour le web service. Et, en fait, peut-être il y a plusieurs clients de services web, et chacun devrait avoir un autre proxy.

Comment peut-proxy être définie par liaison?

Dans le ASMX modèle, je pourrais 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; la WCF-généré proxy côté client les classes ne pas exposer un Proxy de la propriété. Comment dois-je configurer le proxy http, par proxy côté client, et comment puis-je configurer l'authentification sur le proxy http ainsi?

Connexes:
- comment définissez-proxy-avec-pouvoirs-de-produits-wcf-client

69voto

Cheeso Points 87022

Il est logique qu'il n'y a pas de Proxy de propriété sur le proxy WCF, parce que pas tous les proxys WCF utiliser HTTP pour la communication. Après un nouvel examen, j'ai trouvé qu'il est possible de définir le serveur proxy WCF par programme, si le proxy WCF utilise une liaison HTTP. Je suis en train de le documenter ici au cas où quelqu'un d'autre en a besoin. Pour définir le Proxy HTTP dans le code pour un WCF client, faites ceci:

// 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 de point de terminaison - où pour rejoindre le serveur dans le code, vous devez faire quelque chose comme ceci:

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

28voto

tomasr Points 9990

Les paramètres de proxy sont une partie de la configuration de liaison. Par exemple, regardez le ProxyAddress propriété de la BasicHTTPBinding et WSHttpBinding classes et/ou les éléments de configuration.

On dirait que vous êtes en laissant votre point de terminaison de configuration de l'application.fichier de config, dans ce cas, vous devriez être en mesure de définir l'adresse de là.

24voto

Martin Clarke Points 3370

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

J'ai essayé de construction via un UriBuilder, qui serait sortie de l'adresse proxy en tant que "http://username:password@myproxyserver/". Malheureusement, le proxy que j'utilisais ne fonctionne pas avec cette technique.

Ce que j'ai trouvé après de longues recherches sur Google, c'est que vous pouvez changer le proxy à travers WebRequest.DefaultProxy (propriété statique).

Par exemple:

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

4voto

Layinka Points 11

Vous pouvez aussi essayer ceci:

Obtenez par programme la liaison que vous utilisez, puis définissez le proxy directement dessus, 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. Aussi, vous devez définir UseDefaultWebProxy=false ; sinon votre proxy sera ignoré.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X