2009-10-07 140 views
4

我正在通過netTcp綁定使用跨WCF客戶端和服務的事務。 我已啓用DTC,交易按預期流動。測試WCF事務超時

我想測試事務超時。超時

<behavior name="Services.Behavior.NetTcp"> 
      <serviceTimeouts transactionTimeout="00:00:01"/> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 

和服務端點

客戶端發起的事務中

using (TransactionScope scope = 
    new TransactionScope(TransactionScopeOption.Required,new TimeSpan(0,0,1,0))) 
    { 
    ... 

在服務,我已經啓用了交易行爲,

<service behaviorConfiguration="Services.Behavior.NetTcp" 
    name="Services.Accounts.AccountsService"> 
    <endpoint binding="netTcpBinding" bindingConfiguration="TranNetTcpBinding" 
     contract="Services.Accounts.Interfaces.IAccountsService" /> 
    <endpoint address="mex" binding="mexTcpBinding" name="MexTcp" contract="Services.Accounts.Interfaces.IAccountsService" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="net.tcp://localhost:2222/Accounts"/> 
     </baseAddresses> 
    </host> 
    </service> 

,並使用默認服務的默認交易範圍也爲

using (TransactionScope ts = new TransactionScope()) 
{ 

但我沒有從服務中獲取事務超時。如果我從1分鐘減少客戶端超時,我可以看到交易超時。

我知道如果我使用服務上的事務選項,它不會從配置文件讀取超時值,在這裏我沒有使用任何這些選項。

任何想法爲什麼事務不會從服務超時,即使transactionTimeout爲1秒,這是我沒有足夠的時間來完成操作。

如何檢查運行時服務上設置的超時值?

更新1:
從Jual洛伊的編程WCF服務的書:
當一個事務流入配置有比傳入事務較短的超時服務,交易採用該服務的超時,和服務可以執行較短的超時。當事務流入配置了比傳入事務更長的超時的服務時,服務配置不起作用。

來自Lerox Bustamante:From the webcast 提到,如果服務超時加入現有的事務沒有效果,這與Jual所說的完全相反。

更新2:
自考我可以證實,布斯塔曼特是正確的。 如果我申請在服務接口方法的簽名如下屬性,

[TransactionFlow(TransactionFlowOption.NotAllowed)] 

不允許客戶端事務流動,並創建一個新的事務,由於在服務實現屬性的使用,

[OperationBehavior(TransactionScopeRequired = true)] 

從服務配置文件中獲取指定的超時時間並正確超時。

感謝

回答

2

您是否嘗試過在客戶端上設置超時?

例如:

<binding name="IncreasedTimeout" closeTimeout="12:00:00" openTimeout="12:00:00" 
      receiveTimeout="12:00:00" sendTimeout="12:00:00"> 
+1

這將增加運行時間並沒有涉及到的交易。 – skjagini 2009-10-08 15:55:09