2010-12-06 2 views
3

У меня возникла проблема с таймаутом при запуске распределенной транзакции по привязке WCF net.tcp. Сделка всегда заканчивается через ровно 10 минут. Я думаю, что я установил все таймауты, которые я знаю, с более высокой стоимостью, чем это (15 минут), но я, вероятно, что-то пропускаю. Я вызываю службу WCF net.tcp, размещенную в 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(); 
} 

Метод веб-сервис сам по себе имеет следующую подпись:

[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] 
public void HandleSourceChanges(IEnumerable<OrgSyncSourceChange> sourceChanges) 
{ /* Handle changes and store them in the database. */ } 

Но, как я уже сказал, ровно через 10 минут после начала транзакции, это время ожидания , Я не уверен, что сама транзакция истекает. Это может быть еще один компонент, который приводит к тайм-ауту транзакции.

Что мне не хватает? Есть ли настройка IIS, о которой я не знаю? Настройка MSDTC?

ответ

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 минут.

+0

Странно, что это переопределяет значение в вашей конфигурации. Один, чтобы помнить – 2010-12-06 13:38:51

0

Возможно ли это в режиме ожидания в вашем пуле приложений в IIS? Может, стоит расширить это?

+0

Я сам нашел ответ. Собираюсь добавить его через несколько минут. Это был не тайм-аут простоя. – 2010-12-06 12:58:26