16

私は、WCF のディスパッチ プロセス、特にさまざまな拡張ポイントへの影響と効果をよりよく理解しようとしています。下部にリストされている Web ページから、メッセージがチャネル スタックによってディスパッチャーに渡されると、WCF は次の順序で次の処理を実行するように見えます。

  1. メッセージインスペクター
  2. 操作セレクター
  3. メッセージのフォーマット
  4. パラメーター インスペクター
  5. オペレーション・インボーカー。

私が抱えている問題を解決するためのいくつかのオプションを見つけようとしています。私が考えている 1 つの方法は、Message Inspector、Operation Selector、Message Formatting、および Operation Invoker を組み合わせて使用​​することです。残念ながら、私の観察では、実行の順序は次のようになっているようです。

  1. 操作セレクター
  2. メッセージインスペクター
  3. 操作呼び出し元 (AllocateInputs())
  4. メッセージのフォーマット
  5. パラメーター インスペクター
  6. 操作呼び出し元 (Invoke())

Message Formatting セクションでは、特定のメッセージを一連のメソッド引数にデシリアライズして、適切な操作と呼び出し元の AllocateInputs( ) メソッドは、予想されるパラメーターの数を指定します。

私をスローする部分は、Message Inspector と Operation Selector の間のシーケンスの反転です。操作セレクターがメッセージの対象となるサービス操作を決定するのに対し、メッセージ インスペクターがメッセージに作用するときに最初に実行されるのは理にかなっているように思えます。

質問:

  • これは、WCF のバージョンまたはリリースが異なるためですか?
  • これは、WCF が拡張ポイントの実行順序を実際に指定していないためでしょうか。

参照ページ:
カスタム データ形式をサポートするための WCFの拡張- Zulfiqar のウェブログ
カスタム動作による WCFの拡張- MSDN サービス ステーション 2007 年 12 月
メッセージ フロー インターセプト ポイント- Nicholas Allen の Indigo ブログ

注: リンクを提供していないことをお詫びします。私はまだ初心者なので、リンクを複数持つことはできません。=)

4

1 に答える 1

5

コードが実際に実行される順序を判断するには、WCF のトレースをオンにして、生成されたトレース ログを確認することをお勧めします。これは、これを構成ファイルに追加することで有効にできます。

<configuration>
    <system.diagnostics>
        <sources>
            <source name="System.ServiceModel"
                    switchValue="Information, ActivityTracing"
                    propagateActivity="true">
                <listeners>
                    <add name="traceListener"
                        type="System.Diagnostics.XmlWriterTraceListener"
                        initializeData= "c:\log\Traces.svclog" />
                </listeners>
            </source>
        </sources>
    </system.diagnostics>
</configuration>

WCF の拡張ポイントに関しては、Carlos Figueira (Microsoft の WCF エンジニアの 1 人) が、WCF のほぼすべての拡張ポイントを詳述した投稿をしています ( http://blogs.msdn.com/b/carlosfigueira/archive/ 2011/03/14/wcf-extensibility.aspx )。

この投稿の WCF ランタイム セクションでは、順序は次のようにリストされています。

1.2. WCF Runtime
    1.2.1. Message interception 
        1.2.1.1. I[Client/Dispatch]MessageInspector 
        1.2.1.2. IParameterInspector 
    1.2.2. Mapping between message and operation parameter 
        1.2.2.1. I[Client/Dispatch]MessageFormatter 
    1.2.3. Mapping between message and CLR operations 
        1.2.3.1. I[Client/Dispatch]OperationSelector 
        1.2.3.2. IOperationInvoker  
    1.2.4. Instance creation 
        1.2.4.1. IInstanceProvider 
        1.2.4.2. IInstanceContextProvider 
    1.2.5. Error handling 
        1.2.5.1. IErrorHandler 
    1.2.6. Others 
        1.2.6.1. ICallContextInitializer 
        1.2.6.2. IChannelInitializer 
        1.2.6.3. IInteractiveChannelInitializer 

この 2 つの間で、WCF での操作の順序が明確になるはずです。

于 2011-11-18T15:43:27.107 に答える