通过WCF net.tcp绑定运行分布式事务时,我遇到了一个奇怪的超时问题。交易总是在10分钟后超时。我想我已经将所知的所有超时设置为比这更高的值(15分钟),但我可能忽略了一些东西。我正在调用一个在IIS7.5中托管的WCF net.tcp服务。
在服务方面,我有以下绑定配置:
<binding name="OrgSyncService_NetTcpBinding" portSharingEnabled="true"
transactionFlow="true" maxReceivedMessageSize="1048576000"
openTimeout="00:01:00" receiveTimeout="00:15:00" sendTimeout="00:15:00">
<security mode="Transport">
<transport clientCredentialType="Windows"
protectionLevel="EncryptAndSign"/>
</security>
<readerQuotas maxStringContentLength="1073741824" />
<reliableSession enabled="true" inactivityTimeout="00:15:00" />
</binding>
如您所见,所有相关超时都是15分钟。在客户端,绑定配置如下:
<binding name="NetTcpBinding_OrgSyncService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:15:00" sendTimeout="00:15:00"
transactionFlow="true" transferMode="Buffered"
transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog="10"
maxBufferPoolSize="524288" maxConnections="10"
maxReceivedMessageSize="1048576000">
<readerQuotas maxDepth="32" maxStringContentLength="1073741824"
maxArrayLength="16384" maxBytesPerRead="4096"
maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:15:00" enabled="true" />
<security mode="Transport">
<transport clientCredentialType="Windows"
protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
同样,我所知道的所有超时都设置为15分钟。最后,启动事务的代码:
var options = new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadCommitted,
Timeout = TimeSpan.FromMinutes(15)
};
using (var ts = new TransactionScope(TransactionScopeOption.Required, options))
{
// Do transactional work.
// Call web service.
service.HandleSourceChanges(listOfChanges);
ts.Complete();
}
Web服务方法本身具有以下签名:
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void HandleSourceChanges(IEnumerable<OrgSyncSourceChange> sourceChanges)
{ /* Handle changes and store them in the database. */ }
但是,正如我所说,在开始交易后的10分钟,它就会超时。我不确定交易本身会超时。它可能是超时的另一个组件导致事务超时。
我错过了什么?是否有我不知道的IIS设置? MSDTC设置?
答案 0 :(得分:4)
经过长时间的搜索,我自己找到了解决方案。结果是machine.config
中的默认值。那里有一个system.transaction
部分,默认事务超时值为10分钟。此超时将覆盖所有其他超时。
如果您将以下内容添加到machine.config
(在C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config
中),则可以修改此全局超时限制。
<system.transactions>
<machineSettings maxTimeout="00:15:00" />
</system.transactions>
在这种情况下,我将其设置为15分钟。
答案 1 :(得分:0)
它可能是IIS中的应用程序池中的空闲超时设置吗?也许值得延长这个?