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?
Seltsam, dass dies den Wert in Ihrer Konfiguration überschreibt. Ein zu erinnern –
Genau. Ich brauchte ungefähr einen halben Tag, um das herauszufinden. Es ist nicht gerade eine gut dokumentierte Funktion. –