2009-12-28 91 views
2

我有一個BizTalk 2006應用程序,它有一個使用MSMQ的發送端口。我也有一個WCF winforms託管應用程序與幾個WCF服務(在開發環境中,在生產中我使用Windows服務作爲託管)。帶有MSMQIntegrationBinding的WCF不接收隊列中的消息

我創建的一個WCF服務有一個MSMQIntegrationBinding(由於BizTalk不是WCF服務,所以NetMSMQBinding不可能)。

我看到郵件正確放置在遠程隊列上,因爲我激活了郵件選項,並在郵件隊列中看到郵件,但隊列爲空,WCF服務沒有收到郵件。

任何人都可以給我一個線索在哪裏看解決這個問題?

(編輯1):我已經做了一些調查研究在這個題目:

  • 當2006年的BizTalk通信R2與MSMQ,你必須使用MSMQIntegrationBinding因爲NetMSMQBinding僅適用於WCF到WCF
  • 所以我被MSMQIntegrationBinding刪除
  • MSMQIntegration綁定不使用DataContract序列化程序。相反,它會基於MsmqMessageSerializationFormat屬性序列化數據。它的默認值是MsmqMessageSerializationFormat.Xml,這意味着將使用XmlSerializer。這背後的基本原理是,MSMQ集成傳輸是專門爲與本機MSMQ/System互操作而設計的。信息化應用程序
  • 因爲MSMQIntegration綁定使用普通的舊XmlSerializer,所以我沒有簡單的方法使用svcutil.exe生成我的數據類。所以,我必須手動創建我datacontract類.... pfffffffffff

(參考:http://social.msdn.microsoft.com/Forums/en/wcf/thread/2d48fe90-5c2a-4156-8a3f-2e21d5638fa1http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/

(編輯2):

我從WCF檢查診斷跟蹤數據服務和消息由於反序列化異常而被放棄。現在唯一的解決方案是手工創建datacontract類...

(編輯3):通過使用xsd.exe工具而不是svcutil.exe我創建了datacontract類,因此在此處沒有手工製作的工作; - )因此,結論是將xsd.exe用作WCF服務方法中用作參數的數據約定類。這是因爲MSMQIntegrationBinding強制您將所有數據協商類型設置爲可通過XMLSerializer而不是默認的DataContractSerializer進行序列化。

回答

1

你可能想嘗試啓用WCF跟蹤

它可以幫助你理解。什麼正在發生,什麼不發生。

以下是啓用跟蹤的.config示例。確保.config文件位於WCF服務主機的同一個文件夾中。

<configuration> 
    <system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" switchValue="Warning" 
       propagateActivity="true" > 
     <listeners> 
      <add name="xml"/> 
     </listeners> 
     </source> 

     <source name="myUserTraceSource" switchValue="Warning, ActivityTracing"> 
     <listeners> 
      <add name="xml"/> 
     </listeners> 
     </source> 
    </sources> 

    <sharedListeners> 
     <add name="xml" 
      type="System.Diagnostics.XmlWriterTraceListener" 
      initializeData="C:\trace_logs\TraceLog.svclog" /> 
    </sharedListeners> 

    </system.diagnostics> 
</configuration> 

Microsoft提供了一個Service Trace Viewer Tool來讀取.svclog文件。

確保initializeData中的路徑可由您的服務寫入。

+0

感謝Daniel,我已經知道了,但是我在.config文件中引用了它;-)我將激活它以查看WCF日誌。 – 2009-12-28 14:04:21

+0

丹尼爾,我授予你最有用的答案,通過查看跟蹤信息很容易找到解決方案。 – 2009-12-28 21:37:43

+0

幹得好Patrick。我很高興你解決了它。 – 2009-12-28 21:44:46

1

首先要檢查的是WCF服務的權利。與消息隊列的連接是由允許連接到消息隊列的帳戶完成的。

也可能是由於配置錯誤,您的連接配置是否正確?

檢查事件日誌,那裏可能有錯誤,這將指出你在正確的方向。

+0

事件日誌中沒有錯誤。我正在調查隊列名稱是否必須與服務名稱完全一致...... – 2009-12-28 12:22:42

1

您是否驗證過該消息是否確實已由WCF服務留在隊列中,還是正在被拾取並刪除,而未被WCF處理?

我想嘗試的是將一個處理程序附加到ServiceHost實例中的UnknownMessageReceived事件中,並查看是否在收到消息時觸發該事件......這肯定會導致您的服務合同定義錯誤(它可能是你需要使用一個包羅萬象的:

[OperationContract(Action="*")] 

,以確保它被正確地路由到您的方法

相關問題