Ich habe beide Enden einer bidirektional verbundenen Stream
, über die ich kommunizieren möchte. Die zugrunde liegende Implementierung hinter dem Stream ist nicht wichtig, ich möchte auf der Stream
-Ebene arbeiten...
Statt mein eigenes Kommunikationsprotokoll für den Stream zu implementieren, möchte ich die vorhandene WCF-Funktionalität nutzen, um den bestehenden Stream mit einem bidirektionalen (Anforderung/Antwort + Rückruf) WCF-Kommunikationskanal zu umhüllen.
Meine Frage ist, wie kann ich das machen...?
AKTUALISIERUNG:
Ich bin den Weg gegangen und habe einen benutzerdefinierten Transport implementiert. Ich habe das zum Laufen gebracht, aber ich bin immer noch nicht ganz zufrieden damit...
Ich habe ein IDuplexSessionChannel
implementiert, um den Stream zu umhüllen, zusammen mit entsprechenden IChannelFactory
und IChannelListener
, sowie einem Binding-Element zum Erstellen der Kanalfabriken. Jetzt leite ich einfach den verbundenen Stream weiter und gebe diese schließlich in den Transportkanal, wenn er erstellt wird.
Also kann ich den Client-Proxy für den Zugriff auf den Dienst über den Stream wie folgt erstellen:
var callback = new MyCallback();
var instanceContext = new InstanceContext( callback );
var pipeFactory = new DuplexChannelFactory( instanceContext, new StreamBinding(clientStream),
new EndpointAddress("stream://localhost/MyService"));
var serviceProxy = pipeFactory.CreateChannel();
Das Problem, das ich habe, ist, dass es so aussieht, als wäre WCF darauf bedacht, einen ServiceHost
zu verwenden, um das Serverende des Kanals über einen IChannelListener
zu erstellen. In meinem Fall habe ich bereits einen verbundenen Stream, und ich werde nicht in der Lage sein, auf weitere eingehende Verbindungen zu hören. Ich kann das umgehen, aber ich möchte viel lieber keinen ServiceHost
verwenden, um das Serverende des Kanals zu erstellen, weil ich dann mit viel obskurem Boilerplate und Hacks arbeiten muss, um es zum Laufen zu bringen.
Fragen
Ich suche daher nach einem besseren Weg, um die IDuplexSessionChannels zu nehmen und diese an beiden Enden serverseitig und clientseitig in einen Kanalproxy zu wickeln.
Oder vielleicht eine andere ServiceHost-Implementierung, die keinen IChannelListener
erfordert.
Eigentlich liegt das Problem hier darin, dass ich keine einzelne Server-, mehrere Client-Anordnung möchte, sondern eine 1-zu-1-Beziehung zwischen meinem WCF-Dienst und dem Client habe. Gibt es einen richtigen Weg, um eine davon zu instanziieren?
Um es noch einmal anders auszudrücken, ich möchte die Serverseiten-Dienstinstanz erstellen, ohne einen ServiceHost zu verwenden.
Alle Vorschläge wären zu diesem Zeitpunkt willkommen.