除了删除在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服务,该应用程序使用配置了
的netTcpBindingtransactionFlow="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"