wake-up-neo.com

Wie kann ich einen HTTP-Proxy (WebProxy) auf einem clientseitigen WCF-Service-Proxy einrichten?

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

Vollmachten, Vollmachten, Vollmachten.

Gemäß dem WCF-Entwicklungsmodell generiere ich clientseitige "Proxy" -Klassen, indem ich svcutil.exe in der WSDL für den Dienst ausführe. (Dies erzeugt auch eine clientseitige Konfigurationsdatei).

In meinem Code habe ich eine Instanz dieser Klasse neu erstellt und kann eine Verbindung zum Dienst herstellen. Sehr schön.

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

Wir nennen dieses Ding eine Proxy-Klasse, aber es gibt einen anderen Proxy - den http-Proxy. Dieser Dienst verwendet wsHttpBinding basicHttpBinding und geht daher über http. Angenommen, ich möchte den Client über einen http-Proxy (modelliert von einem System.Net.WebProxy in .NET BCL) mit dem Webdienst verbinden. Ich weiß aus meiner umfangreichen, erfreulichen Erfahrung beim Lesen der .NET- und WCF-Dokumentation, dass die WCF-Laufzeit bei der Kommunikation über http/https den Standardsystemproxy verwendet, sofern nicht anders angegeben.

Ich kann das über die Befehlszeile in WinXP/2003 einstellen mit ProxyCfg.exe wie hier beschrieben und in späteren Versionen von Windows mit netsh.exe wie hier beschrieben .

Ich kann auch den Standard-Webproxy für die Verwendung in der Anwendung angeben, indem ich die System.Net.WebRequest.DefaultWebProxy-Eigenschaft setze.

Angenommen, ich möchte eine Verbindung über einen Proxy herstellen, der sich vom systemweiten Proxy unterscheidet. Zum Beispiel gibt es vielleicht keinen systemweiten Proxy, aber ich muss einen speziell für den Webdienst verwenden. Oder vielleicht gibt es einen systemweiten Proxy, aber ich muss einen anderen für den Webdienst verwenden. Tatsächlich gibt es möglicherweise mehrere Webdienst-Clients, und jeder sollte einen anderen Proxy erhalten.

Wie kann der Proxy pro Bindung eingestellt 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); 

Mit WCF ist dies jedoch nicht möglich. Die von WCF generierten clientseitigen Proxy-Klassen machen keine Proxy-Eigenschaft verfügbar. Wie stelle ich den HTTP-Proxy pro clientseitigem Proxy ein und wie stelle ich die Authentifizierung auch auf dem HTTP-Proxy ein?

Verbunden:
- Wie wird der Proxy mit den Anmeldeinformationen auf den generierten wcf-Client gesetzt?

45
Cheeso

Die Proxy-Einstellungen sind Teil der Bindungskonfiguration. Schauen Sie sich beispielsweise die ProxyAddress -Eigenschaft der BasicHTTPBinding - und WSHttpBinding -Klassen/Konfigurationselemente an.

Es sieht so aus, als würden Sie Ihre Endpunktkonfiguration in der Datei app.config belassen. In diesem Fall sollten Sie in der Lage sein, die Adresse dort festzulegen.

25
tomasr

Es ist sinnvoll, dass auf dem WCF-Proxy keine Proxy-Eigenschaft vorhanden ist, da nicht alle WCF-Proxys HTTP für die Kommunikation verwenden. Nach weiterer Überprüfung stellte ich fest, dass es möglich ist, den Proxy in WCF programmgesteuert festzulegen, wenn der WCF-Proxy eine HTTP-Bindung verwendet. Ich dokumentiere es hier, falls jemand anderes es braucht. Gehen Sie folgendermaßen vor, um den HTTP-Proxy im Code für einen WCF-Client festzulegen:

// 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 um die Endpunktadresse - wo Sie den Server erreichen - im Code festzulegen, würden Sie Folgendes tun:

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

Ich hatte ein ähnliches Problem, musste aber auch einen Benutzernamen und ein Kennwort für den Proxy verwenden, die sich von dem Benutzernamen und dem Kennwort unterscheiden, die für den Zugriff auf den Dienst verwendet wurden.

Ich habe versucht, es über einen UriBuilder aufzubauen, der die Proxy-Adresse als " http: // Benutzername: Passwort @ myproxyserver / " ausgab. Leider hat der von mir verwendete Proxy mit dieser Technik nicht funktioniert.

Was ich nach ausgiebigem Googeln gefunden habe, ist, dass Sie den Proxy über WebRequest.DefaultProxy (statische Eigenschaft) ändern können.

Beispielsweise:

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

Sie können dies auch versuchen:

Rufen Sie programmgesteuert die von Ihnen verwendete Bindung ab und stellen Sie den Proxy direkt darauf ein, z.

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

wo "WSDualHttpBinding_IMainService" ist der Name Ihrer Bindung aus Ihrer Konfigurationsdatei. Außerdem musst du UseDefaultWebProxy=false; Andernfalls wird Ihr Proxy ignoriert.

3
Layinka