私はWCFを初めて使いました。直接ServiceModelレイヤーにアクセスする
WCFは、「チャネル」レイヤーを単独で使用するための機能を豊富に備えているようです。たとえば、サーバーを作成するには、バインディングからチャネルリスナーを作成し、WaitForRequest、Replyなどを呼び出すことができます。これらのメソッドはすべてメッセージオブジェクトを処理します。したがって、メッセージで何かを行うのはあなた次第です。
私の質問は、既にメッセージが届いたらどうなるのですか? ServiceContractとメッセージで記述されたサービスを実装するオブジェクトがあるとします。このオブジェクトは特定の操作の呼び出しを表しています。私は何とかタイプのために作成されますIOperationInvokerとIDispatchMessageFormatterオブジェクトにアクセスすることができれば、それは非常に簡単になり、非常に少なくとも、
Message requestMessage = GetMessageSomehow();
OperationDescription oc = GetContractForMessage();
Message replyMessage = Invoke(myService, oc, requestMessage);
:私が本当にしたいことのようなものですそれらを連鎖させて、私が探している機能を得ることができます。
私の特別なケースでは、(WS-Addressingのない)単純なSoap 1.1と1.2のサービスを実装する必要があります。私はすでにHttpListenerRequest/Responseオブジェクトを持っており、SOAPActionまたはContentTypeヘッダに基づいてルーティングすることができます。
私はこの機能を持つことがユニットテストにも非常に役立つと思います。たとえば、既存のクライアントに実装する必要があります。サービスクラスの属性が正しいことをテストすることができます(つまり、私が得ようとしていることがわかっているメッセージがサービスインタフェースの呼び出しに正しく変換されることをテストすることができます)。
提案がありますか?
あなたが探している機能は、正確には何ですか?あなたの質問は、あなた自身がメッセージルーティングを処理したいことを示唆しています.WCFの文脈では巨大な作業です。あなたはもっと具体的になりますか? – Ben
いくつかの情報を追加しました。あなたはルーティングについて良い点を挙げています。私の場合は、自分でやっているところでは簡単ですが、ルーティングがチャンネルレイヤから分離できない理由はありません。Messageオブジェクトにはルーティングを行うために必要なすべての情報が必要です。 – JimSteele1222