2009-12-20 28 views
1

我剛剛閱讀了關於WCF事務和流程的a fantastic article。幾乎只給我留下了一個懸而未決的問題:如何在同一個項目中使用兩個服務強制執行WCF事務流合同?

我有一個單個項目兩種服務方式定義:

ServiceA.svc 

    [OperationBehavior(TransactionScopeRequired = true)] 
    OperationA() 


ServiceB.svc 

    [OperationBehavior(TransactionScopeRequired = true)] 
    OperationB() 

OperationA()需要調用OperationB()

我可以很容易只是說從ServiceA(內new ServiceB().OperationB(...)記得我說,他們是在同一臺服務器上運行相同的Web項目。

起初我以爲這是我會做什麼,但我不知道交易是否會全部搞砸 - 特別是如果交易合約在兩個操作之間有差異,很明顯,如果我從OperationB內部訪問Transaction.Current,那麼它將存在,但如果兩個操作有不同的合約(如參考文章)規則將不會被遵循

什麼是正確的w唉ServiceA.OperationA()致電ServiceB.OperationB()

(好奇又如何做到這一點,當一個操作調用另一個在同一個班,但是那可能是一個比較容易的事情谷歌)

回答

1

與WCF的基本假設是,你總是呼叫的服務方法通過客戶端代理。這種行爲允許WCF運行時進入調用堆棧,並盡其所能。

所以在你的情況下,如果你想從ServiceA調用ServiceB,你應該在ServiceA中創建ServiceB的客戶端代理,並在該客戶端代理上調用ServiceBClientProxy.OperationB()。通過Visual Studio的「添加服務引用」對話框,在幕後基本上只是調用svcutil.exe命令行實用程序,您也可以撥打

  • 您可以通過多種方式創建一個客戶端代理直。這創造了很好的代理和所有,但可怕的配置

  • 因爲這兩個服務在同一個項目中,兩個都將有權訪問彼此的合同,對嗎?在這種情況下,您可以通過幾行代碼手動創建客戶端代理。

基本上,你需要的是你的ServiceB的服務合同ChannelFactory<T>實例,然後調用該通道工廠CreateChannel()方法來獲得該服務的實際信道(=客戶端代理)。事情是這樣的:

ChannelFactory<IServiceB> factory = new ChannelFactory<IServiceB>(); 
IServiceB clientProxy = factory.CreateChannel(); 

這需要從web.config所有的細節 - 如果你願意,你可以在代碼中定義的綁定和端點,並將其傳遞到構造函數的ChannelFactory。

現在你有一個ServiceB的客戶端代理,你可以調用它的所有方法。這是在WCF中使用它的正確方法。

希望這會有所幫助!

+0

多數民衆贊成在我正在尋找感謝。我有一本關於我的kindle的WCF書,但它很難找到像這樣的東西。 PS。我從上次你提到的30%起:-) – 2009-12-20 10:15:42

相關問題