2010-12-06 24 views
3

J'ai un étrange problème de dépassement de délai lors de l'exécution d'une transaction distribuée via une liaison net.tcp WCF. La transaction expire toujours après exactement 10 minutes. Je pense que j'ai mis tous les délais d'attente que je connais à une valeur plus élevée que cela (15 minutes), mais je suis probablement en train de négliger quelque chose. J'appelle un service net.tcp de WCF hébergé dans IIS7.5.Problème de délai d'attente lors d'une transaction distribuée via la liaison net.tcp de WCF

Du côté du service, je la configuration de liaison suivante:

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

Comme vous pouvez le voir, tous les délais d'attente sont pertinents 15 minutes. Sur le côté client, la configuration de liaison est la suivante:

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

Encore une fois, tous les délais d'attente que je connais sont mis à 15 minutes. Enfin, le code qui commence la transaction:

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

La méthode de service Web lui-même a la signature suivante:

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

Mais, comme je l'ai dit, exactement 10 minutes après le début de la transaction, il arrive à expiration . Je ne suis pas sûr que ce soit la transaction elle-même qui expire. Il peut s'agir d'un autre composant qui expire et qui entraîne l'expiration de la transaction.

Qu'est-ce qui me manque? Y a-t-il un paramètre IIS que je ne connais pas? Un paramètre MSDTC?

Répondre

4

J'ai trouvé la solution après une longue recherche. Il s'est avéré être une valeur par défaut dans machine.config. Il y a une section system.transaction avec une valeur de délai d'attente de transaction par défaut de 10 minutes. Ce délai d'attente remplace tous les autres délais d'attente.

Si vous ajoutez ce qui suit à votre machine.config (dans mon cas, dans C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config), vous pouvez modifier cette limite de délai global.

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

Dans ce cas, je l'ai réglé à 15 minutes.

+0

Étrange que cela remplace la valeur dans votre config. Un à retenir –

+0

Exactement. Il m'a fallu environ une demi-journée pour comprendre cela. Ce n'est pas exactement une fonctionnalité bien documentée. –

0

Cela peut-il être le paramètre de délai d'inactivité dans votre App Pool dans IIS? Peut-être que cela vaut la peine

+0

J'ai trouvé la réponse moi-même. Je vais l'ajouter dans quelques minutes. Ce n'était pas le réglage du délai d'inactivité. –