测试WCF事务超时

时间:2009-10-07 20:26:58

标签: c# wcf transactions

我在使用netTcp绑定的WCF客户端和服务中使用事务。 我启用了DTC,交易按预期流动。

我想测试超时的事务。

客户端启动交易

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

在服务上,我已启用超时的事务行为

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

和服务终点,

<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分钟减少客户端超时,我可以看到交易超时。

我知道如果我在服务上使用事务选项,它将不会从配置文件中读取超时值,这里我没有使用任何这些选项。

任何想法为什么即使事务时间为1秒,事务也不会从服务中超时,这在我的情况下还不足以完成操作。

如何在运行时检查服务上设置的超时值?

更新1:
来自Jual Lowy编程WCF服务书:
当事务流入配置了比传入事务更短的超时的服务时,事务采用服务的超时,服务将强制执行更短的超时。当事务流入配置了超过传入事务的超时的服务时,服务配置不起作用。

来自Lerox Bustamante:From the webcast 提到服务超时如果加入现有事务则无效,与Jual所说的完全相反。

更新2:
从测试我可以确认Bustamante是正确的。 如果我在Service接口中的方法签名上应用以下属性,

[TransactionFlow(TransactionFlowOption.NotAllowed)]

不允许客户端事务流动,并且由于在Service实现中使用属性而创建新事务,

[OperationBehavior(TransactionScopeRequired = true)]

从服务配置文件中获取指定的超时时间并正确超时。

谢谢

1 个答案:

答案 0 :(得分:3)

您是否尝试过在客户端设置超时?

例如:

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