一个WCF客户端背后配置错误的防火墙"挂起"所有WCF客户端使用来自其他工作站的相同WCF服务的时间过长

时间:2018-06-13 22:34:54

标签: c# .net wcf msdtc

除了删除在WCF客户端上创建的TransactionScope(并有效地将msdtc从图片中删除)之外,当托管WCF客户端的单个工作站配置错误时,是否有另一种方法可以避免过长的WCF服务范围挂起(或遇到通信问题)?

我们有一个使用C#实现的简单WCF服务,以及一个在调用WCF服务代理之前创建TransactionScope的简单WCF客户端。

如果Windows防火墙允许通过防火墙从/向msdtc.exe进行TCP通信,那么两者都可以正常工作。但是,如果单个工作站配置错误(即启用了防火墙,并且禁用了msdtc.exe的TCP入站规则),则尝试与该服务通信将阻止所有其他WCF客户端(已正确配置)与WCF服务至少41秒(给定TCP重新传输的当前设置),尽管我们使用了更短的WCF绑定超时设置以及TransactionScope超时。

WCF服务用

修饰
[System.ServiceModel.ServiceBehavior(
    InstanceContextMode = System.ServiceModel.InstanceContextMode.PerCall,
    ReleaseServiceInstanceOnTransactionComplete = false,
    ConcurrencyMode = System.ServiceModel.ConcurrencyMode.Multiple,
    IncludeExceptionDetailInFaults = false,
    TransactionTimeout = "00:00:13"
   )

WCF服务有一个操作合同,用

装饰
 [System.ServiceModel.TransactionFlow(System.ServiceModel.TransactionFlowOption.Mandatory)] 

在类接口中。在类本身中,同样的方法用[System.ServiceModel.OperationBehavior(TransactionScopeRequired = true)]

进行修饰

使用Windows控制台应用程序托管WCF服务,该应用程序使用配置了

的netTcpBinding
transactionFlow="true"  transactionProtocol="OleTransactions"  sendTimeout="00:00:20"  receiveTimeout="00:00:20"

从为其netTcpBinding配置了以下值的Windows窗体客户端应用程序访问该服务:

                 transactionFlow="true"
                 transactionProtocol="OleTransactions" 
                 transferMode="Streamed" 
                 sendTimeout="00:00:20"
                 receiveTimeout="00:00:20"

0 个答案:

没有答案