2009-10-07 144 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