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)
从服务配置文件中获取指定的超时时间并正确超时.
谢谢
您是否尝试过在客户端上设置超时?
例如:
<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)
归档时间: |
|
查看次数: |
2436 次 |
最近记录: |