2009-05-22 10 views
0

Ich habe eine Webanwendung, die Webdienste mit WCF und wsHttpBindings verfügbar macht. Es ist möglich, die Anwendung auf verschiedenen Computern und verschiedenen URLs zu verwenden. Dies würde bedeuten, dass der WCF-Dienststandort für jeden Dienst anders wäre.Bestimmen Sie wsHttpBinding zur Laufzeit mit WCF

Ich erstelle einen Windows-Dienst, der auf jede Anwendung verweist und eine Aufgabe ausführt. Jede Aufgabe muss einen Dienst in der Webanwendung aufrufen. Ich verstehe, dass die Bindungen alle in der app.config eingerichtet sind, aber gibt es eine einfachere Möglichkeit, den Dienst dynamisch aufzurufen, oder wie würde ich die app.config strukturieren?

Antwort

1

Ihre Kundenkonfigurationsdatei wie folgt aussehen könnte:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <client> 
     <endpoint name="Endpoint1" 
       address="http://location1.com/LunarChartRestService.svc" 
       binding="wsHttpBinding" 
       contract="(whatever-your-contract-is)" /> 
     <endpoint name="Endpoint2" 
       address="http://location2.com/LunarChartRestService.svc" 
       binding="wsHttpBinding" 
       contract="(whatever-your-contract-is)" /> 
     <endpoint name="Endpoint3" 
       address="http://location3.com/LunarChartRestService.svc" 
       binding="wsHttpBinding" 
       contract="(whatever-your-contract-is)" /> 
    </client> 
    </system.serviceModel> 
</configuration> 

dann in Code können Sie einen solchen Endpunkt (Client-Proxy) erstellen, basierend auf seinen Namen und somit können Sie wählen je nachdem, welche Position Sie benötigen. Nichts hält Sie davon ab, mehrere Client-Proxys zu erstellen! Sie können also mit mehreren Client-Proxies eine Verbindung zu mehreren Serverendpunkten herstellen, kein Problem.

Alternativ können Sie natürlich auch eine Instanz von "WsHttpBinding" und "EndpointAddress" im Code erstellen und die erforderlichen Eigenschaften (falls vorhanden) festlegen und dann den Konstruktor für den Client-Proxy mit diesen vorgefertigten Objekten aufrufen. so überschreibt die gesamte app.config Zirkus und die Schaffung von was auch immer Sie benötigt wird, um das Gefühl:

EndpointAddress epa = 
    new EndpointAddress(new Uri("http://location1.com/LunarChartRestService.svc")); 
WSHttpBinding binding = new WSHttpBinding(); 

Marc

+0

Ich habe Probleme, Beispiele für die Erstellung der ClientProxy, der Punkt, in dem der Anruf wird gemacht, um die Ergebnisse zurückzugeben. – mickyjtwin

+0

Wenn Sie Ihren Dienst in Betrieb haben, können Sie Visual Studio entweder Ihren Client erstellen lassen (indem Sie mit der rechten Maustaste auf Ihr Projekt klicken und "Dienstverweis hinzufügen" wählen) oder das Befehlszeilendienstprogramm "svcutil" verwenden das Gleiche tun. Dadurch wird der clientseitige Proxy erstellt, der über die erforderlichen Konstruktoren verfügt. –

+0

Aber wenn ich eine Service-Referenz hinzufügen, die speziell für einen Endpunkt korrekt ist? Ich brauche es, damit der Endpunkt konfigurierbar ist. – mickyjtwin

0

Aus Ihrer Beschreibung klingt es, als ob alle Server den gleichen Servicevertrag offen legen. Wenn dies der Fall ist, können Sie in Ihrer Datei web.config einfach mehrere endpoints deklarieren und eine zur Laufzeit basierend auf dem Endpunktnamen auswählen.

Natürlich kann es sein, dass Sie es vorziehen, nicht mit diesem Teil der WCF-Konfiguration zu tun und lieber nur eine einfachere Liste von URLs haben und damit erledigt werden. Das ist auch möglich. Sie müssen nur ein wenig mehr Arbeit auf der Codepage ausführen, um die clientseitigen Proxies/Kanalobjekte zu instanziieren.

+0

wissen Sie über alle Beispiele für den „einfacheren Weg“ zu tun, und der Zugriff auf/unter Verwendung mehrerer Endpunkte bei Laufzeit? – mickyjtwin

+0

das Service-Setup auf der Web-Anwendung ist auch wshttp, nicht grundlegend. – mickyjtwin

+0

Es gibt mehrere Möglichkeiten, dies ist nur einer von ihnen: http://msdn.microsoft.com/en-us/library/ms734681.aspx – tomasr

Verwandte Themen