2009-05-14 2 views
0

Ich implementiere einen WCF-Dienst (Vertrag A), der schließlich Anrufe zu einem eigenständigen Dienst (Vertrag B) macht, der vom Client gehostet wird. Zur Entwurfszeit, wenn der Client die WSDL meines Diensts anfragt, um seinen Proxy zu erstellen, möchte ich die WSDL für Vertrag B einbeziehen, damit der Client seinen Dienst darauf aufbauen kann. Leider kann ich nicht herausfinden, wie Vertrag B in die WSDL injiziert wird, die von dem Dienst ausgegeben wird. Da der Vertrag eine Schnittstelle ist und nicht über das [DataContract] -Attribut verfügt, kann ich ihn nicht als bekannten Typ hinzufügen. Gibt es eine andere Möglichkeit, einen Vertrag in emittierte WSDL zu injizieren?Ich injiziere einen nicht verwandten Vertrag in die WSDL, die vom MEX-Provider der WCF erstellt wurde

Hier ist ein Beispiel:

[ServiceContract] 
public interface IServerService 
{ 
    [OperationContract] 
    void GiveTheServerMyServiceUri(string uri); 

    [OperationContract] 
    void TellAllClientsSomething(string message); 
} 

// THIS IS THE INTERFACE I WANT TO INCLUDE IN THE WSDL 
[ServiceContract] 
public interface IClientService 
{ 
    [OperationContract] 
    void ReceiveMessageFromServer(string message); 
} 

public class ServerService : IServerService 
{ 
    private List<string> knownClients; 

    public void GiveTheServerMyServiceUri(string uri) 
    { 
    knownClients.Add(uri); 
    } 

    public void TellAllClientsSomething(string message) 
    { 
    foreach (string clientUri in knownClients) 
    { 
     // 1. Create instance of ClientServiceProxy using client's uri 
     // 2. Call proxy.ReceiveMessageFromServer(message) 
    } 
    } 
} 

Zunächst scheint es, dass dies ein Lehrbuchbeispiel eines Duplex-Vertrag. Für diese spezielle Anwendung benötige ich jedoch aus einer Reihe von Gründen ein bisschen mehr Trennung zwischen Client und Server, so dass ich hoffte, dem Client einfach eine Schnittstelle zu geben, um ihn (über die WSDL) zu hosten und dann seinen eigenen Dienst zu hosten Sag mir einfach die URL des Service.

Antwort

1

Ich sehe nicht, dass dies Sinn macht. Sofern Ihr Dienst den Servicevertrag des anderen Dienstes nicht ausführt, tun Sie dies nicht.

Auf der anderen Seite, kann Ihr Dienst den anderen Servicevertrag implementieren und ein Client für den anderen Dienst werden. Er kann dann Anrufe an den anderen Dienstvertrag an diesen anderen Dienst delegieren.


Ich habe gerade versucht, dies sicherzustellen. Ich habe ein neues WCF-Service-Bibliotheksprojekt erstellt. Dadurch wurde ein Service1 erstellt, der IService1 mit zwei Operationen implementiert. Ich habe das [ServiceContract] -Attribut geändert, um einen bestimmten Namespace (http://localhost/service1) zu verwenden.

Ich fügte dann einen neuen Dienst hinzu, der mir Service2, IService2 implementierend, mit einer einzelnen Operation (DoWork) gab. Ich habe den [ServiceContract] aktualisiert, um http://localhost/service2/ zu verwenden.

Ich aktualisierte dann Service1, um IService2 sowie IService1 zu implementieren und IService2.DoWork an den Dienst Service2 zu delegieren. Ich musste auch einen neuen Endpunkt hinzufügen, der IService2 implementierte, und ich musste eine relative Adresse angeben, so dass die beiden nicht kollidierten (da sie sich im selben Projekt befanden). Hier ist das Ergebnis:

using System; 

namespace WcfServiceLibrary1 
{ 
    public class Service1 : IService1, IService2 
    { 
     public string GetData(int value) 
     { 
      return string.Format("You entered: {0}", value); 
     } 

     public CompositeType GetDataUsingDataContract(CompositeType composite) 
     { 
      if (composite.BoolValue) 
      { 
       composite.StringValue += "Suffix"; 
      } 
      return composite; 
     } 

     public void DoWork() 
     { 
      Service2Reference.IService2 svc = null; 
      try 
      { 
       svc = new Service2Reference.Service2Client(); 
       svc.DoWork(); 
      } 
      finally 
      { 
       if (svc != null) 
       { 
        ((IDisposable)svc).Dispose(); 
       } 
      } 
     } 
    } 
} 
Verwandte Themen