我在使用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)]
从服务配置文件中获取指定的超时时间并正确超时。
谢谢
答案 0 :(得分:3)
您是否尝试过在客户端设置超时?
例如:
<binding name="IncreasedTimeout" closeTimeout="12:00:00" openTimeout="12:00:00"
receiveTimeout="12:00:00" sendTimeout="12:00:00">