2011-01-04 26 views
0

私はWCFを初めて使いました。直接ServiceModelレイヤーにアクセスする

WCFは、「チャネル」レイヤーを単独で使用するための機能を豊富に備えているようです。たとえば、サーバーを作成するには、バインディングからチャネルリスナーを作成し、WaitForRequest、Replyなどを呼び出すことができます。これらのメソッドはすべてメッセージオブジェクトを処理します。したがって、メッセージで何かを行うのはあなた次第です。

私の質問は、既にメッセージが届いたらどうなるのですか? ServiceContractメッセージで記述されたサービスを実装するオブジェクトがあるとします。このオブジェクトは特定の操作の呼び出しを表しています。私は何とかタイプのために作成されますIOperationInvokerIDispatchMessageFormatterオブジェクトにアクセスすることができれば、それは非常に簡単になり、非常に少なくとも、

Message requestMessage = GetMessageSomehow(); 
OperationDescription oc = GetContractForMessage(); 
Message replyMessage = Invoke(myService, oc, requestMessage); 

:私が本当にしたいことのようなものですそれらを連鎖させて、私が探している機能を得ることができます。

私の特別なケースでは、(WS-Addressingのない)単純なSoap 1.1と1.2のサービスを実装する必要があります。私はすでにHttpListenerRequest/Responseオブジェクトを持っており、SOAPActionまたはContentTypeヘッダに基づいてルーティングすることができます。

私はこの機能を持つことがユニットテストにも非常に役立つと思います。たとえば、既存のクライアントに実装する必要があります。サービスクラスの属性が正しいことをテストすることができます(つまり、私が得ようとしていることがわかっているメッセージがサービスインタフェースの呼び出しに正しく変換されることをテストすることができます)。

提案がありますか?

+0

あなたが探している機能は、正確には何ですか?あなたの質問は、あなた自身がメッセージルーティングを処理したいことを示唆しています.WCFの文脈では巨大な作業です。あなたはもっと具体的になりますか? – Ben

+0

いくつかの情報を追加しました。あなたはルーティングについて良い点を挙げています。私の場合は、自分でやっているところでは簡単ですが、ルーティングがチャンネルレイヤから分離できない理由はありません。Messageオブジェクトにはルーティングを行うために必要なすべての情報が必要です。 – JimSteele1222

答えて

0

メッセージインスタンスから呼び出しの実際のパラメータへのシリアル化/逆シリアル化は、通常、IDispatchMessageFormatter/IClientMessageFormatterによって行われます。

サーバー側では、データコントラクトシリアライザ(または他のシリアライザ)が挿入するカスタム操作動作によって、DispatchRuntimeにIDispatchMessageFormatterが注入されます。

しかし、ServiceHostを使用していない場合は、DispatchRuntimeはありません。基本的には、このすべてが欲しい場合は、自分ですべての努力をしなければならないでしょう。

これは、OperationDescriptionオブジェクトを取得できれば、DataContractSerializerOperationBehaviorをインスタンス化できるはずですが、それからIDispatchMessageFormatterを取得することはできません...あなたはXmlObjectSerializerを得ることができますが、それはあなたにとって有用かもしれないし、そうでないかもしれません。

IOperationInvokerはあまり役に立たないことに注意してください。これはあなたがすでにメッセージのシリアル化/逆シリアル化を行っていることを前提としているので、それほど有用ではありません(残りの機能は基本的な使用例

+0

私はそれほど恐れました... XmlObjectSerializerは、いくつかの理由でそのトリックをあまり行っていません。私はモノからIDispatchMessageFormatterの実装を引き出すつもりです。残念ですが、最初から始めるよりも良いです:) – JimSteele1222

関連する問題