2009-03-26 4 views
5

Ich lerne immer noch die ganze WCF-Sache, also bitte bitte mit mir hier.Wie mehrere WCF-Dienste von einem Client zu verbrauchen

Ich habe zwei selbst gehostete Dienste erstellt mit C# und VS 2008:
Service # 1 Fügt zwei Zahlen hinzu und gibt das Ergebnis zurück.
Service # 2 Gibt das Quadrat einer Zahl zurück.

Ich möchte, dass der Client in der Lage ist, zwei Zahlen an Dienst 1 zu senden, die Summe zu erhalten und dann die Summe an Dienst 2 zu senden und das Quadrat zu erhalten.

Ich habe zwei generierte Proxies für beide Dienste, und ich kann Intellisense auf ihnen verwenden, so dass dieser Teil angeblich funktioniert.

Nun, wie konfiguriere ich meine app.config-Datei so, dass ich mit beiden Diensten kommunizieren kann? Im Moment bekomme ich jedes Mal eine Ausnahme, wenn ich das versuche.

[Der Client funktioniert gut, wenn ich nur zu einem Zeitpunkt eine der Konfigurationen in der App-Datei hat, und versuche, nur diesen Server zu nennen.]

Ich nehme dies eine sehr noobish Frage, und die Antwort wahrscheinlich ist "Struktur der Konfigurationsdatei in _____ Art und Weise", aber Google scheint einfach kein Beispiel/Leitfaden zu haben.

Wer weiß, wie man das macht?

Hinweis: Consume multiple WCF services from one client client Obwohl klingt wie ein Duplikat ist nicht das, was ich suche.

Edit: Dank marc_s, ich habe es funktioniert

sowohl mit den Leistungen in verschiedenen Anwendungen ausgeführt wird, brauchte ich nicht die Server-Konfigurationsdatei zu spalten, aber hier ist das, was ich mit der Client-Config tat Dateien: Zuerst die Konfigurationsdateien mit SvrUtil.exe automatisch generiert und sie dann auf diese Weise verschmolzen:

<bindings> 
    <wsHttpBinding> 

    <binding> 
    ... 
    </binding> 

    <binding> 
    ... 
    </binding> 

    </wsHttpBinding> 
</bindings> 

...

<endpoint> 

...

+0

+1 - abgestimmt auf Dich zu 2K rep von 1.999 zu stoßen, so dass Sie jetzt anderen Menschen Antworten editieren! woot! –

+0

@ Jeremy: Haha danke! Es ist unglaublich, wie lange es 1999 stecken geblieben ist. – Mostlyharmless

Antwort

3

Wenn Sie die beiden Dienste auf separaten Endpunkte/Ports laufen, tun Sie etwas wie folgt aus:

Server-Seite:

<service name="Service1"> 
    <endpoint address="http://localhost:8001/service1.asmx" 
      binding="basicHttpBinding" 
      contract="IService1" /> 
</service> 
<service name="Service2"> 
    <endpoint address="http://localhost:8002/service2.asmx" 
      binding="basicHttpBinding" 
      contract="IService2" /> 
</service> 

Client-side:

<client> 
    <endpoint address="http://localhost:8001/service1.asmx" 
      binding="basicHttpBinding" 
      contract="IService1" 
      name="Service1" /> 
    <endpoint address="http://localhost:8002/service2.asmx" 
      binding="basicHttpBinding" 
      contract="IService2" 
      name="Service2" /> 
</client> 

Das sollte Ihnen zwei separate, individuelle Endpunkte auf dem Server und einen Client geben, der mit beiden kommuniziert.

Marc

+0

Danke, das hat funktioniert! Es gab so viele Permutationen, um die Konfigurationsdateien zusammenzufassen, die ich gerade entschieden habe, anstatt alle Permutationen abzudecken: P – Mostlyharmless

0

Haben Sie gerade einen Kampf der Endpunkte? Stellen Sie sicher, dass beide Dienste nicht zum Beispiel für die Überwachung der gleichen Portnummer konfiguriert sind. Wenn Sie Ihre Konfigurationsdatei (oder eine bereinigte Version davon) posten könnten, würde das helfen.

+0

Ich habe sie beide auf dem gleichen Port laufen, aber ich bin in der Lage, Service A von Service B zu rufen, beide hören Port 8000. Angenommen, ich führe sie auf verschiedenen Ports, Wie strukturiere ich die app.config? – Mostlyharmless

+0

Unter haben Sie mehrere Elemente und so weiter. Sie können nicht einfach beide vollständigen Konfigurationsabschnitte kopieren, sondern müssen sie zusammenführen. –

3

Ich weiß, dass Sie nach einer App.Config Antwort gefragt haben, aber das könnte helfen. Ich würde normalerweise beginnen, indem ich zuerst die Clientverbindungen programmatisch konfiguriere, da es einfacher ist, und sobald du das funktioniert hast, könntest du es in deine App.Config verschieben.

Hier ist ein Beispiel für die Konfiguration eines WCF-Clients.

BasicHttpBinding binding = new BasicHttpBinding(); 
EndpointAddress address = new EndpointAddress(serverURL); 
MyServiceClient myServiceProxy = new MyServiceClient(binding, address); 

Sie könnten dann etwas wie das unten in Ihrer App.Config haben.

<client> 
    <endpoint address="http://localhost/service1.asmx" 
      binding="basicHttpBinding" 
      bindingConfiguration="basicHttpBinding" 
      contract="IService1" 
      name="Service1" /> 
    <endpoint address="http://localhost/service2.asmx" 
      binding="basicHttpBinding" 
      bindingConfiguration="basicHttpBinding" 
      contract="IService2" 
      name="Service2" /> 
</client> 
Verwandte Themen