WCF IIS gehostet Dienst mehrere Verträge von einem einzigen Dienst implementiert - wie teile ich uri zwischen Endpunkten über Config

9

Ich habe eine Reihe von Serviceverträgen, die meine Serviceschnittstelle in Stücke verwandter Funktionalität aufteilen. Ich implementiere derzeit alle Verträge, die eine einzige Serviceklasse verwenden (möchte diese später spalten, aber für den Moment genügt die einzelne Serviceklasse).

Ich versuche zu verwenden, konfigurieren Sie die Endpunkte mit einer Konfigurationsdatei (im Gegensatz zu Via-Code). Das Problem ist, dass ich ein ServiceActivationException bekomme, weil die zwei Endpunkte (einer für jeden Dienstvertrag) versuchen, auf der gleichen uri zu hören. Die Ausnahmedetails sagen, dass die beiden Endpunkte das Binding-Objekt teilen müssen, was sinnvoll ist, aber ich kann nicht herausfinden, wie dies über Config zu tun ist (Ich habe nicht versucht, dies über Code zu tun, wie ich in IIS aber hosten Ich kann mir vorstellen, dass es eine einfache Übung ist, im Code zu konfigurieren).

Das Folgende ist die Konfiguration, die ich gerade verwende (dies ist immer noch dev, so dass ich mich derzeit nicht um Sicherheitsbedenken sorge, die einige dieser Einstellungen offen legen könnten):

%Vor%

Also meine Frage ist, wie teile ich diese Bindung zwischen den beiden Endpunkten?

Kommentare in diese SO-Frage deuten darauf hin, dass ich das vielleicht nicht kann, aber ich glaube nicht, dass das richtig ist.

UPDATE 1 Laut dieser MS-Veröffentlichung was? Ich mache es sollte in Ordnung sein ...

UPDATE2 Hier ist der Inhalt der SVC-Datei, wenn es hilft:

%Vor%

UPDATE 3 Hier ist das Ausnahmedetail:

  

Es wurde bereits eine Bindungsinstanz zum Abhören der URI '********************' zugeordnet. Ob   zwei Endpunkte möchten dieselbe ListenUri teilen, sie müssen auch dieselbe Bindung teilen   Objektinstanz. Die beiden widersprüchlichen Endpunkte wurden entweder angegeben   AddServiceEndpoint () ruft in einer Konfigurationsdatei oder einer Kombination von AddServiceEndpoint () auf   und konfigurieren.

UPDATE 4 Ok, ich habe dies schon vorher verpasst, "Sie müssen relative Adressen verwenden, wenn Sie mehr als einen Endpunkt für einen bestimmten .svc-Dienst verfügbar machen". Der Grund dafür liegt darin, dass das virtuelle IIS-Verzeichnis die Basisadresse des Service bestimmt. Kann das jemand etwas ausführlicher erklären, also warum IIS für jeden Vertrag eine relative Adressierung benötigt.

    
Simon Fox 25.09.2009, 02:02
quelle

1 Antwort

7

Nach meinem Wissen, und ich habe im letzten Monat umfangreiche Arbeiten mit WCF durchgeführt, können Sie nicht denselben exakten URI für mehr als einen Endpunkt teilen. In WCF wird ein "Service" nicht durch die Implementierung eines Vertrags definiert, sondern durch den Vertrag selbst (der auch WSDL- und Standard-SOA-Praktiken berücksichtigt.) Endpoints ermöglichen es Ihnen, einen einzelnen Service über mehrere Protokolle (und damit unterschiedliche Adressen) verfügbar zu machen. , aber Sie können nicht verschiedene Dienste an derselben Adresse teilen. Logischerweise würde das nicht funktionieren.

Nehmen Sie das folgende Szenario an (was Sie zu erreichen versuchen):

%Vor%

Es ist einfach genug, auf den MEX-Endpunkt zuzugreifen ... er hat einen eindeutigen URI. Wie greifen Sie jedoch auf IProductService oder ICategoryService zu? Es gibt nichts, was es Ihnen erlaubt, die beiden anderen als eine URI zu unterscheiden. WCF hat nichts, was es erlaubt, zwischen Nachrichten, die an IProductservice gehen sollen, und solchen, die an ICategoryService gehen sollen, zu routen. Da beide die gleiche URI verwenden, haben Sie tatsächlich einen Konflikt. Jeder Servicevertrag muss über einen eindeutigen URI verfügbar gemacht werden. Jeder Endpunkt, der dieselbe exakte Bindung verwendet, muss eine eindeutige Adresse verwenden.

Es gibt einen Weg, um das zu erreichen, was Sie brauchen. Das Problem ist Nachrichtenrouting. WCF unterstützt nativ keine Nachrichtenweiterleitung OOB, bietet jedoch die Möglichkeit, einen eigenen Nachrichtenrouter zu implementieren. (Oder, wenn Sie bereit sind, Beta-Tech zu verwenden, kommt .NET 4.0 mit einem Nachrichten-Router out of the box, basierend auf den unten verlinkten Artikeln, aber mit verbesserter Konfigurierbarkeit.) Michele Bustamante, eine wahre Zauberin der WCF, hat eine vollständige Implementierung und Artikel zur Beschreibung des Nachrichten-Routing unter den folgenden Links:

Ссылка Ссылка

Die allgemeine Idee ist, dass Sie einen einzelnen Dienst einrichten, der einen einzelnen URI überwacht. Dieser Dienst verwendet die Platzhalterverteilung für eine einzelne Dienstoperation, die dann bestimmt, an welchen eindeutigen URI jede Nachricht weitergeleitet werden soll. Sie können die Entscheidung beliebig treffen, am einfachsten über die Anfrage Action, vorausgesetzt, dass jede Aktion auf Ihren beiden Schnittstellen, IProductService und ICategoryService, global einzigartig ist. Sie werden jedoch mit mehr Diensten enden ... der Router selbst ist ein eigenständiger WCF-Dienst, der wie jeder andere gehostet werden müsste.

    
jrista 25.09.2009, 04:38
quelle