2010-12-06 17 views
3

WCF net.tcpバインディングを介して分散トランザクションを実行すると、異常なタイムアウトの問題が発生します。トランザクションは常に正確に10分後にタイムアウトします。私は私が知っているすべてのタイムアウトをそれより高い値に設定したと思うが(15分)、おそらく何かを見落としているだろう。私はIIS7.5でホストされているWCF net.tcpサービスを呼び出しています。サービス面では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サービスメソッド自体は、次のシグネチャがあります。私が言ったように、正確に10分の取引を開始した後、

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

をしかし、それがタイムアウト。私はそれがタイムアウトするトランザクション自体であるかどうかはわかりません。トランザクションがタイムアウトする原因となるタイムアウトの別のコンポーネントである可能性があります。

私には何が欠けていますか?私が知らない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

これはあなたの設定の値を上書きするという不思議なことです。 1つは覚えています –

+0

まさに。これを理解するには約半日かかりました。まさに文書化された機能ではありません。 –

0

IISのアプリケーションプールでアイドルタイムアウトの設定になっていませんか?おそらくこれを拡張する価値がありますか?

+0

私は自分自身で答えを見つけました。それを数分で追加します。アイドルタイムアウト設定ではありませんでした。 –

関連する問題