2010-12-06 4 views
3

Ich habe ein merkwürdiges Timeout-Problem, wenn eine verteilte Transaktion über eine WCF-net.tcp-Bindung ausgeführt wird. Die Transaktion läuft immer nach genau 10 Minuten ab. Ich denke, dass ich alle Zeitüberschreitungen, die ich kenne, auf einen höheren Wert gesetzt habe (15 Minuten), aber wahrscheinlich übersehe ich etwas. Ich rufe einen WCF net.tcp-Dienst auf, der in IIS7.5 gehostet wird.Zeitlimitproblem in verteilter Transaktion über WCF-net.tcp-Bindung

Auf der Serviceseite, ich habe die folgende Bindung config:

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

Wie Sie sehen können, alle relevanten Timeouts sind 15 Minuten. Auf der Client-Seite ist die Bindungskonfiguration wie folgt:

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

Wieder alle Timeouts, die ich bewusst bin auf 15 Minuten festgelegt. Schließlich beginnt der Code, der die Transaktion:

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(); 
} 

Die Web-Service-Methode selbst die folgende Signatur hat:

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

Aber, wie gesagt, genau 10 Minuten nach Beginn der Transaktion, es mal aus . Ich bin mir nicht sicher, ob die Transaktion selbst ausläuft. Es kann eine andere Komponente sein, bei der das Zeitlimit überschritten wird, wodurch die Zeitüberschreitung der Transaktion verursacht wird.

Was fehlt mir? Gibt es eine IIS-Einstellung, über die ich nichts weiß? Eine MSDTC-Einstellung?

Antwort

4

Ich fand die Lösung nach langer Suche selbst. Es stellte sich heraus, dass es sich um einen Standardwert in machine.config handelt. Es gibt dort einen system.transaction Abschnitt mit einem Standard-Transaktionszeitlimitwert von 10 Minuten. Diese Zeitüberschreitung überschreibt alle anderen Zeitüberschreitungen.

Wenn Sie Folgendes zu Ihrem machine.config hinzufügen (in meinem Fall in C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config), können Sie dieses globale Zeitlimit ändern.

<system.transactions> 
    <machineSettings maxTimeout="00:15:00" /> 
</system.transactions> 

In diesem Fall habe ich es auf 15 Minuten eingestellt.

+0

Seltsam, dass dies den Wert in Ihrer Konfiguration überschreibt. Ein zu erinnern –

+0

Genau. Ich brauchte ungefähr einen halben Tag, um das herauszufinden. Es ist nicht gerade eine gut dokumentierte Funktion. –

0

Könnte es die Leerlauf-Zeiteinstellung in Ihrem App-Pool in IIS sein? Vielleicht lohnt sich das zu verlängern?

+0

Ich fand die Antwort selbst. Ich werde es in ein paar Minuten hinzufügen. Es war nicht die Leerlaufzeitbegrenzung. –

Verwandte Themen