wcf - 什么是 WCF 调度管道消息流

标签 wcf wcf-extensions

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

  • 消息检查员
  • 操作选择器
  • 消息格式
  • 参数检查器
  • 操作调用者。

  • 我试图找到一些选项来解决我遇到的问题,我想到的一种方法是使用消息检查器、操作选择器、消息格式和操作调用器的组合。不幸的是,我的观察似乎表明执行顺序如下:
  • 操作选择器
  • 消息检查员
  • 操作调用程序 (AllocateInputs())
  • 消息格式
  • 参数检查器
  • 操作调用程序 (Invoke())

  • 我可以理解在格式化消息之前调用自定义调用程序 AllocateInputs() 方法的细微差别,因为 Message Formatting 部分本质上是将给定的消息反序列化为一组方法参数,以传递给适当的操作和调用程序的 AllocateInputs( ) 方法指定需要多少个参数。

    抛出我的部分是消息检查器和操作选择器之间的顺序反转。在我看来,首先运行 Message Inspectors 是合乎逻辑的,因为它们对消息采取行动,而 Operation Selector 确定消息的目标服务操作。

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

  • 引用页面:
    Extending WCF to support custom data formats - Zulfiqar 的博客
    Extending WCF with Custom Behaviours - MSDN 服务站 2007 年 12 月
    Message Flow Interception Points - Nicholas Allen 的 Indigo 博客

    注意:我很抱歉没有提供链接,不能超过一个,因为我仍然是一个菜鸟。 =)

    最佳答案

    为了确定代码执行的实际顺序,我建议打开 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 中的操作顺序应该变得清晰。

    关于wcf - 什么是 WCF 调度管道消息流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1854409/

    相关文章:

    .net - 在 Windows 上生成 ActivityTracing 事件日志

    c# - 从 EF 返回 2 列的自定义列表

    .net - 无法加载为扩展 '[extensionHere]' 注册的类型 [nameHere]

    .net - 区分来自客户端和其他服务的请求

    c# - WCF 错误 : extension could not be loaded

    WCF : Configuring message security programmatically

    c# - 捕获特定的 WCF FaultException

    .net - 直接浏览时 WCF 元数据不可用

    multithreading - WCF Operation.Context 不是线程安全的?

    c# - WCF:在 IErrorHandler 中提供通用 FaultException