双方向に接続されStream
ているので、通信を行いたいと思います。ストリームの背後にある基本的な実装は重要ではありません、私はStream
レベルで働きたいです...
ストリームに独自の通信プロトコルを実装するのではなく、既存のWCFの良さをすべて使用して、双方向(要求/応答+コールバック)のWCF通信チャネルで既存のストリームをラップしたいと思います。
私の質問は、どうすればこれを行うことができますか...?
アップデート:
私はカスタムトランスポートを実装する道を歩みました。私はこれを機能させていますが、それでも完全には満足していません...
ストリームをラップするためのを適切なandIDuplexSessionChannel
とともに実装し、チャネルファクトリを作成するためのBindingElementを実装しました。ここで、接続されたストリームを通過し、作成時に最終的にこれらをトランスポートチャネルに渡します。IChannelFactory
IChannelListener
したがって、次のように、ストリームを介してサービスにアクセスするためのクライアントプロキシを作成できます。
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();
私が抱えている問題は、WCFがを使用しServiceHost
てチャネルのサーバー側を作成するように設定されているようIChannelListener
です。私の場合、すでに接続されたストリームがあり、これ以上着信接続をリッスンできなくなります。ServiceHost
これを回避することはできますが、チャネルのサーバーエンドを作成するためにを使用することはあまりありません。これは、それを機能させるために多くのあいまいな定型文とハックが発生するためです。
質問
したがって、IDuplexSessionChannelsを取得し、サーバー側とクライアント側の両方でこれらをチャネルプロキシにラップするためのより良い方法を探しています。
または、を必要としない別のServiceHost実装かもしれませんIChannelListener
。
実際、ここでの問題は、単一のサーバー、複数のクライアントの配置が必要ないことです。WCFサービスとクライアントの間に1対1の関係があります。これらのいずれかをインスタンス化する正しい方法はありますか?
別の言い方をすれば、ServiceHostを使用せずにサーバー側のサービスインスタンスを作成したいと思います。
この段階で何か提案をいただければ幸いです。