17

双方向に接続されStreamているので、通信を行いたいと思います。ストリームの背後にある基本的な実装は重要ではありません、私はStreamレベルで働きたいです...

ストリームに独自の通信プロトコルを実装するのではなく、既存のWCFの良さをすべて使用して、双方向(要求/応答+コールバック)のWCF通信チャネルで既存のストリームをラップしたいと思います。

私の質問は、どうすればこれを行うことができますか...?

アップデート:

私はカスタムトランスポートを実装する道を歩みました。私はこれを機能させていますが、それでも完全には満足していません...

ストリームをラップするためのを適切なandIDuplexSessionChannelとともに実装し、チャネルファクトリを作成するためのBindingElementを実装しました。ここで、接続されたストリームを通過し、作成時に最終的にこれらをトランスポートチャネルに渡します。IChannelFactoryIChannelListener

したがって、次のように、ストリームを介してサービスにアクセスするためのクライアントプロキシを作成できます。

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を使用せずにサーバー側のサービスインスタンスを作成したいと思います。

この段階で何か提案をいただければ幸いです。

4

1 に答える 1

1

両端でクライアントを使用します。ただし、契約を慎重に定義する必要があります。ストリームのどちらかの端に ClientA と ClientB がある場合、ClientA が要求を送信すると、ClientB は定義されたコールバック コントラクトとして表示されるものと同じように見えることを期待し、その逆も同様です。

于 2015-10-08T20:09:45.467 に答える