Während ich versuche, WCF zu lernen, und es scheint geradlinig genug, kam ich durch eine seltsame Situation ... zumindest scheint es mir seltsam.WCF :: ServiceHost & AddServiceEndpoint: Sind die Argumenttypen umgekehrt?
Warum nimmt der ServiceHost ctor eine konkrete Klasse und der AddServiceEndpoint die Schnittstelle und nicht umgekehrt? es scheint, dass letzteres vom OOP-Standpunkt aus logischer ist.
Betrachten Sie das folgende:
[ServiceContract]
interface IVocalAnimal
{
[OperationContract]
string MakeSound();
}
...
public class Dog : IVocalAnimal
{
public string MakeSound()
{
return("Woof!");
}
}
...
public class Cat : IVocalAnimal
{
public string MakeSound()
{
return("Meeooow!");
}
}
So, jetzt wir "AnimalSound" Service wanto erstellen, die Sie den Klang eines Hundes oder einer Katze über/AnimalSoundService/Hund oder/AnimalSoundService/Cat
erhalten verbinden kann...
Uri baseAddress = new Uri("net.pipe://localhost/AnimalSoundService");
ServiceHost serviceHost = new ServiceHost(typeof(IVocalAnimal), baseAddress);
serviceHost.AddServiceEndpoint(typeof(Dog), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), "Dog");
serviceHost.AddServiceEndpoint(typeof(Cat), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), "Cat");
...
Aber der obige Code wird nicht so aus irgendeinem Grund zusammenstellen (s) ich verstehe nicht ganz, will der Servicehost ctor die konkrete Klasse (also entweder Hund oder Katze) und die EndPoint will die Schnittstelle.
Aus diesem Grund ist es nicht umgekehrt, denn es scheint mir natürlicher zu sein, dass der feinere Granularitätsendpunkt eine spezifische Implementierung unterstützt (sodass Sie bestimmte Implementierungen des Vertrags pro Endpunktadresse treffen können), während der allgemeinere ServiceHost sollte derjenige sein, der die Schnittstelle akzeptiert?
Btw, ich bin nicht pedantisch..ich versuche nur ehrlich zu verstehen, da ich mir sicher bin, dass ich hier etwas verpasst habe.
"Zweck von Endpunkten ist nicht die Bereitstellung mehrerer Implementierungen, sondern die Bereitstellung mehrerer Protokolle/Bindungen für den Zugriff auf eine einzige Implementierung" <--- OK, macht Sinn. Ich habe es rückwärts verstanden. Aber sagen Sie, dass meine ServiceHost-Basis ist "http: // localhost: 8000/AnimalSoundService/Service" und ich HTTP-Bindung verwenden, das bedeutet, dass ein anderer ServiceHost nicht in der Lage sein wird, den gleichen Port zu teilen, und Client muss eine Verbindung herstellen verschiedene Häfen? – Futurist
Nach einem kleinen Experiment habe ich festgestellt, dass 2 serviceHost Instanzen den gleichen Port teilen können. Ich denke, um mein Beispiel zu verbessern, erstelle ich 2 serviceHost mit 2 verschiedenen Basisadressen: net.pipe: // localhost/AnimalSoundService/Dog und net.pipe: // localhost/AnimalSoundService/Cat ..Es macht jetzt mehr Sinn. Danke Jay. – Futurist
Das Abhören für jeden Dienst an seinem eigenen Port ist eine Option. Ich habe eine Lösung, die diesen Ansatz verwendet - 3 Dienste, 3 Ports, aber nur beim Debuggen. Hosting in IIS, das ist natürlich kein Problem - jeder Dienst ist per URL adressierbar. Der Schlüssel zum Teilen Ihrer Dienste an einem einzigen Port ist Net.TCP Port Sharing, das speziell für WCF ist: http://msdn.microsoft.com/en-us/library/aa395195.aspx – Jay