2009-10-06 77 views
1

我有一個運行工作在MSMQ一個WCF日誌服務。項目被記錄到Sql Server 2005數據庫。如果在TransactionScope之外使用,每個函數都是正確的。在TransactionScope實例中使用時,調用總是導致事務中止。消息=「交易已中止」。調用WCF與netMsmqBinding內的TransactionScope停止交易

什麼我需要做的就是這個電話轉給一個事務中的工作?這是否可能?我讀過,對於一個客戶端事務跨服務邊界流動的結合必須支持交易流程,這立即限制綁定唯一NetNamedPipeBinding,NetTcpBinding的,的WSHttpBinding,WSDualHttpBinding和WSFederationHttpBinding。

回答

4

我對MSMQ並不瞭解,但Tom Hollander在MSMQ, IIS and WCF: Getting them to play nicely上有一篇非常好的博客文章系列 - 第3部分是Tom提供有關獲取交易的鏈接。

MSMQ可以是事務 - 或沒有。在WCF中,您可以將服務合同以及單個操作合同(方法)與事務相關的屬性進行裝飾,例如是允許,禁止還是需要事務上下文。

據我瞭解,在你的設置,你不希望MSMQ部分是事務性的 - 但你應該能夠使用它,即使一個環境事務是存在的。在這種情況下,您需要將TransactionFlow =「允許」添加到你的經營合同是這樣的:

[ServiceContract] 
public interface ILoggingService 
{ 
    [OperationContract] 
    [TransactionFlow(TransactionFlowOption.Allowed)] 
    void LogData(......); 
} 

應該這樣做!

Marc

+0

謝謝馬克。你是對的。我不希望交易行爲(尤其是其中一項服務是電子郵件發送服務)。我會嘗試這個屬性。 – 2009-10-06 22:50:04

2

對不起,不必要的問題...

我已經解決了我的問題。我需要把

[TransactionFlow(TransactionFlowOption.Allowed)] 

上的操作在服務合同,然後

[OperationBehavior(TransactionScopeRequired=true)] 

的合同(服務本身)的實現。

作品一種享受。

+0

你打我秒! :-) – 2009-10-06 08:20:38

+1

無論如何都發布了我的回覆,因爲它包含Tom Hollander在WCF和MSMQ上撰寫的博客文章系列的良好鏈接 - 非常棒的閱讀! – 2009-10-06 08:22:01