什么是WCF调度管道消息流

时间:2009-12-06 05:01:05

标签: wcf wcf-extensions

我正在努力更好地了解WCF的调度过程,特别是对各种可扩展性点的影响和影响。从底部列出的网页看,一旦消息通过通道堆栈传递给调度程序,WCF将按照规定的顺序执行以下操作。

  1. Message Inspector
  2. 操作选择器
  3. 邮件格式
  4. 参数检查器
  5. Operation Invoker。
  6. 我正在尝试找到一些方法来解决我遇到的问题,我想到的一种方法是使用Message Inspector,Operation Selector,Message Formatting和Operation Invoker的组合。不幸的是,我的观察似乎表明执行的顺序如下:

    1. 操作选择器
    2. 消息检查器
    3. 操作调用者(AllocateInputs())
    4. 邮件格式
    5. 参数检查器
    6. Operation Invoker(Invoke())
    7. 我可以理解在格式化消息之前调用自定义调用者AllocateInputs()方法的细微差别,因为消息格式化部分基本上将给定消息反序列化为一组方法参数,以传递给适当的操作,并且调用者的AllocateInputs()方法指定了预期的参数数量。

      抛出我的部分是Message Inspector和Operation Selector之间的序列反转。对于我来说,消息检查器首先运行,因为它们对消息起作用,而操作选择器确定消息所针对的服务操作,这听起来合乎逻辑。

      问题:

      • 是由于WCF的不同版本或版本?
      • 这是因为WCF实际上没有指定可扩展点执行顺序吗?

      参考页:
      Extending WCF to support custom data formats - Zulfiqar的博客日志 Extending WCF with Custom Behaviours - MSDN服务站2007年12月
      Message Flow Interception Points - 尼古拉斯·艾伦的靛蓝博客

      注意:对于不提供链接,我道歉,因为我还是一个菜鸟,所以不能有多个链接。 =)

1 个答案:

答案 0 :(得分: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(微软WCF的工程师之一)的帖子详细描述了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 

我认为在两者之间,WCF中的操作顺序应该变得清晰。