Frage

Wie kann ich den HTTP-Proxy gesetzt programmatisch auf einem WCF-Client, ohne den Standard-Proxy zu verwenden?

Proxies, Proxies Proxies.

Nach dem WCF-Modell der Entwicklung, erzeuge ich clientseitige „Proxy“ Klassen von svcutil.exe auf der WSDL für den Dienst ausgeführt wird. (Das auch produziert eine clientseitige Konfigurationsdatei).

In meinem Code I neu-up eine Instanz dieser Klasse und ich kann die Verbindung Bedienung. Sehr schön.

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

Wir nennen das, was eine Proxy-Klasse, aber es ist ein weiterer Proxy - der HTTP-Proxy. Diese Dienst verwendet wsHttpBinding Basichttpbinding, so wird es über http. Nun nehme ich an den Client mit dem Web-Service verbinden wollen über ein HTTP-Proxy (modelliert durch eine System.Net.WebProxy in .NET BCL). ich weiß aus meiner umfangreichen, herrlichen Erfahrung Lesen .NET und WCF-Dokumentation, dass die WCF-Laufzeit, wenn nicht anders angewiesen, wird die Standardeinstellung verwenden System-Proxy, wenn die Kommunikation über http / https.

Ich kann das Set von der Kommandozeile in WinXP / 2003 mit ProxyCfg.exe wie hier beschrieben, und später in Versionen von Windows mit netsh.exe wie hier beschrieben.

Ich kann auch den Standard-Web-Proxy für die Verwendung innerhalb der Anwendung angeben durch Setzen der System.Net.WebRequest.DefaultWebProxy Eigenschaft .

Aber angenommen, ich möchte einen Proxy verbinden, über die als die andere ist systemweite Proxy? vielleicht Zum Beispiel gibt es keine systemweiten Proxy aber Ich brauche insbesondere eine für den Web-Service zu nutzen. Oder vielleicht gibt es eine systemweite Proxy, aber ich brauche ein anderes zu verwenden, für das Web Bedienung. Und vielleicht in der Tat gibt es mehrere Web-Service-Clients, und Jeder sollte einen anderen Proxy bekommen.

Wie kann die Proxy-per-Bindung festgelegt werden?

Im ASMX Modell, könnte ich dies tun:

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

Das ist aber mit WCF nicht möglich; der WCF-generierte clientseitigen Proxy Klassen aussetzen keine Proxy-Eigenschaft. Wie richte ich den HTTP-Proxy, pro Client-seitige Proxy, und wie kann ich die Authentifizierung auf dem HTTP-Proxy als auch?

  

Siehe auch:
  - how-to-Set-Proxy-mit-credentials -zu-generated-wcf-client

War es hilfreich?

Lösung

Die Proxy-Einstellungen sind Teil der Bindungskonfiguration. Zum Beispiel sehen Sie die Proxyaddress Eigentum die und Basichttpbinding WSHttpBinding Klassen / Konfigurationselemente.

Sieht aus wie Sie Ihre Endpunkt-Konfiguration in der Datei app.config sind verlassen, in diesem Fall sollten Sie die Adresse dort einstellen können.

Andere Tipps

Es macht Sinn, dass es keine Proxy-Eigenschaft auf dem WCF-Proxy ist, weil nicht alle Proxies WCF HTTP für die Kommunikation. Nach einer weiteren Überprüfung, fand ich, dass es möglich ist, den Proxy in WCF programmatisch zu setzen, wenn die WCF-Proxy-Bindung eines HTTP verwendet. Ich dokumentieren sie hier falls jemand anderes es braucht. Um den HTTP-Proxy in Code für einen WCF-Client gesetzt, dies zu tun:

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

Und die Endpunkt-Adresse einzustellen - wo den Server zu erreichen - in Code, würden Sie so etwas tun:

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

Ich habe ein ähnliches Problem hatte, aber ich habe auch einen Benutzernamen und Passwort für den Proxy zu verwenden, erforderlich, die aus dem Benutzernamen und Passwort unterscheiden verwendet, um auf den Dienst zugreifen.

Ich habe versucht, es den Aufbau durch eine UriBuilder auf, die Ausgabe der Proxy-Adresse würde als „ http: // username: password @ myProxyServer / “. Leider habe ich die besondere Proxy wurde unter Verwendung nicht mit dieser Technik arbeiten.

Was ich fand, nach umfangreichen googeln, ist, dass Sie den Proxy durch WebRequest.DefaultProxy (statische Eigenschaft) ändern können.

Zum Beispiel:

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

Sie können auch versuchen, diese:

Programmatically bekommen, was die Bindung Sie verwenden, und legen Sie den Proxy auf sie direkt z.

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

wo "WSDualHttpBinding_IMainService" ist der Name des aus Ihrer Konfigurationsdatei zu binden. Außerdem müssen Sie setzen UseDefaultWebProxy=false; sonst wird Ihre Proxy ignoriert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top