Question

J'ai les deux extrémités d'un lien bidirectionnel Stream, sur lequel je veux faire une communication. La mise en œuvre sous-jacente derrière le flux n'est pas importante, je veux travailler au Stream niveau...

Plutôt que de mettre en œuvre mon propre protocole de communication pour le flux, je souhaite utiliser toutes les bontés WCF existantes pour envelopper le flux existant avec un canal de communication WCF bidirectionnel (demande / réponse + rappel).

Ma question est, comment puis-je faire cela ...?

METTRE À JOUR:

J'ai emprunté la mise en œuvre d'un transport personnalisé. J'ai ça qui fonctionne, mais je n'en suis toujours pas totalement satisfait ...

J'ai implémenté un IDuplexSessionChannel Pour envelopper le flux, avec approprié IChannelFactory et IChannelListener, et un élément de liaison pour créer les usines de canaux. Maintenant, je passe simplement à travers le flux connecté, et finalement les transmettre dans le canal de transport lorsqu'il est créé.

Ainsi, je peux créer le proxy client pour accéder au service via le flux comme suit:

var callback = new MyCallback();
var instanceContext = new InstanceContext( callback );
var pipeFactory = new DuplexChannelFactory<IMyService>( instanceContext, new StreamBinding(clientStream),
                                                        new EndpointAddress("stream://localhost/MyService"));
var serviceProxy = pipeFactory.CreateChannel();

Le problème que j'ai est, il semble que WCF soit défini sur l'utilisation d'un ServiceHost Pour créer l'extrémité du serveur du canal, via un IChannelListener. Dans mon cas, j'ai déjà un flux connecté, et je ne pourrai pas écouter plus de connexions entrantes. Je peux contourner cela, mais je préfère de loin ne pas utiliser un ServiceHost Pour créer l'extrémité du serveur du canal, car je me retrouve avec beaucoup de chauffeur obscur et de piratage pour le faire fonctionner.

Des questions

Je cherche donc une meilleure façon de prendre les IDUplexSessionChannels et de les envelopper dans un proxy de canal à la fois du serveur et du client.

Ou peut-être une implémentation de service différente qui ne nécessite pas de IChannelListener.

Vraiment, le problème ici est que je ne veux pas un seul serveur, un arrangement client multiple, j'ai une relation 1-1 entre mon service WCF et le client. Existe-t-il une façon correcte d'instancier une d'entre elles?

Pour dire encore une autre manière, je souhaite créer l'instance de service côté serveur sans utiliser un servicehost.

Toute suggestion serait appréciée à ce stade.

Était-ce utile?

La solution

Utilisez un client aux deux extrémités. Vous devrez cependant définir soigneusement vos contrats. Si vous avez Clienta et ClientB à l'un ou l'autre extrémité du flux, lorsque Clienta envoie une demande, ClientB s'attendra à ce qu'elle ressemble à ce qu'elle considère comme un contrat de rappel défini et vice versa.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top