我正在通过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)]
从服务配置文件中获取指定的超时时间并正确超时。
感谢
这将增加运行时间并没有涉及到的交易。 – skjagini 2009-10-08 15:55:09