测试WCF事务超时

skj*_*ini 5 c# wcf transactions

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

我想测试事务超时.

客户端启动事务为

using (TransactionScope scope = 
    new TransactionScope(TransactionScopeOption.Required,new TimeSpan(0,0,1,0)))
    {
     ...
Run Code Online (Sandbox Code Playgroud)

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

<behavior name="Services.Behavior.NetTcp">
          <serviceTimeouts transactionTimeout="00:00:01"/>
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
Run Code Online (Sandbox Code Playgroud)

和服务终点,

<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>
Run Code Online (Sandbox Code Playgroud)

并使用默认的服务默认事务范围

using (TransactionScope ts = new TransactionScope())
{
Run Code Online (Sandbox Code Playgroud)

但我没有从服务中获得交易超时.如果我从1分钟减少客户端超时,我可以看到交易超时.

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

知道为什么即使transactionTimeout为1秒,事务也没有从服务中超时,这在我的情况下还不足以完成操作.

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

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

来自Lerox Bustamante:来自网络广播 提到服务超时如果加入现有交易就没有效果,与Jual所说的完全相反.

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

[TransactionFlow(TransactionFlowOption.NotAllowed)]
Run Code Online (Sandbox Code Playgroud)

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

[OperationBehavior(TransactionScopeRequired = true)]
Run Code Online (Sandbox Code Playgroud)

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

谢谢

JL.*_*JL. 3

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

例如:

<binding name="IncreasedTimeout" closeTimeout="12:00:00" openTimeout="12:00:00"
             receiveTimeout="12:00:00" sendTimeout="12:00:00">
Run Code Online (Sandbox Code Playgroud)