Проблема тайм-аута в распределенной транзакции через привязку WCF net.tcp - PullRequest
3 голосов
/ 06 декабря 2010

У меня странная проблема тайм-аута при выполнении распределенной транзакции через привязку WCF net.tcp. Время транзакции истекает ровно через 10 минут. Я думаю, что установил для всех известных мне тайм-аутов более высокое значение (15 минут), но я, вероятно, что-то пропускаю. Я звоню в службу WCF net.tcp, размещенную в IIS7.5.

На стороне службы у меня есть следующая конфигурация привязки:

<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?

Ответы [ 2 ]

4 голосов
/ 06 декабря 2010

Я нашел решение сам после долгих поисков. Это оказалось значением по умолчанию в 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 голосов
/ 06 декабря 2010

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

...