2009-12-06 25 views
15

我試圖更好地理解WCF的調度過程,特別是對各種擴展點的影響和影響。從底部列出的網頁看來,一旦通過通道堆棧將消息傳遞給調度器,WCF將按照所述順序執行以下操作。什麼是WCF調度管道消息流

  1. 消息檢查
  2. 操作選擇
  3. 消息格式化
  4. 參數檢查
  5. 操作調用程序。

我試圖找到一些選項來解決我有一個問題,我想的一個方法是使用消息檢查器,操作選擇器,消息格式和操作調用者的組合。不幸的是,我的觀察似乎表明執行的順序是代替如下:

  1. 工作選擇
  2. 消息檢查
  3. 操作祈求(AllocateInputs())
  4. 消息格式化
  5. 參數檢查器
  6. Opera和灰調用器(調用())

我可以理解的微小差異,其中一個自定義調用AllocateInputs()方法被格式化消息作爲消息格式化部之前調用基本上deserialising給定的消息爲一組的方法的參數傳遞給適當的操作,調用者的AllocateInputs()方法指定需要多少個參數。

引發我的部分是Message Inspector和Operation Selector之間的序列反轉。對我來說,消息檢查器首先在消息上執行操作時聽起來合乎邏輯,而操作選擇器則確定消息針對哪個服務操作。

問題:

  • 是,由於WCF的不同版本或釋放?
  • 這是因爲WCF實際上沒有指定擴展點執行順序嗎?

參考頁:
Extending WCF to support custom data formats - 佐勒菲卡爾的博客
Extending WCF with Custom Behaviours - MSDN服務站2007年12月
Message Flow Interception Points - 尼古拉斯·艾倫的Indigo博客

注:我不提供鏈接的道歉,可以」因爲我還是個小菜鳥,所以我不止一個。=)

+1

在那裏,我投票了你的故事。您現在可以發佈多個鏈接,因爲您將擁有11個代表...也許:P –

+2

我爲您添加了鏈接,@hg。 – bobbymcr

+0

啊......我不知道這是與代表。非常感謝@Crowe。 感謝@bobbymcr也提供了鏈接。 希望得到一些答案是否太多了? =) –

回答

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的擴展點,卡洛斯·費圭(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順序應該變得清晰之間。