2011-02-01 6 views
5

Ho un processo basato su WCF piuttosto lungo. Il servizio WCF viene eseguito in Azure se è di aiuto. Il problema credo che abbia a che fare con i timeout:Problema di timeout WCF?

1) client WinForms ha la seguente impostazione .config nella sezione vincolante:

<wsHttpBinding> 
    <binding name="XXX" closeTimeout="00:05:00" openTimeout="00:05:00" 
    receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false" 
    transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
    maxBufferPoolSize="10000000" maxReceivedMessageSize="10000000" 
    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
    allowCookies="false"> 
    <readerQuotas maxDepth="255" maxStringContentLength="8192" maxArrayLength="16384" 
    maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
    <reliableSession ordered="true" inactivityTimeout="00:10:00" 
    enabled="false" /> 
    <security mode="TransportWithMessageCredential"> 
    <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> 
    <message clientCredentialType="UserName" negotiateServiceCredential="true" algorithmSuite="Default" establishSecurityContext="false"/> 
    </security> 
    </binding> 
</wsHttpBinding> 

2) servizio WCF ha la seguente sezione vincolante nel web.config

<wsHttpBinding> 
    <binding name="XXX" maxReceivedMessageSize="10000000" sendTimeout="00:10:00" receiveTimeout="00:10:00" closeTimeout="00:10:00" openTimeout="00:10:00"> 
    <security mode="TransportWithMessageCredential"> 
     <message clientCredentialType="UserName" establishSecurityContext="false" /> 
    </security> 
    <readerQuotas maxArrayLength="2000000" maxBytesPerRead="10000000" maxStringContentLength="10000000" maxDepth="255" /> 
    </binding> 

    </wsHttpBinding> 

3) Ho un metodo a esecuzione prolungata in WCF (in genere 2 minuti). I client chiamano il metodo e quelli che eseguono più a lungo di 1 minuto vengono espulsi con un'eccezione. Questa è l'eccezione più interna:

<InnerException> 
    <Type>System.Net.Sockets.SocketException</Type> 
    <Message>An existing connection was forcibly closed by the remote host</Message> 
    <StackTrace> 
     <Frame>at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)</Frame> 
    </StackTrace> 
    </InnerException> 
</InnerException> 

4) La WCF sé completato con successo chiamare, però (ho sia inizio/fine connesso lato server). Come evito l'eccezione?

Grazie!

+0

Ogni volta che ci vuole più di un minuto per eseguire, restituisce questo errore. L'errore viene restituito al client precisamente dopo un minuto. Tuttavia, il server sta ancora terminando la chiamata al metodo. – Igorek

risposta

8

Il servizio di bilanciamento del carico di Windows Azure interrompe le connessioni inattive dopo 60 secondi.

+1

Steve, wow, non lo sapevo assolutamente ... c'è comunque un modo per prolungare il timeout? Alcune chiamate potrebbero richiedere più di 1 minuto! – Igorek

+0

Interessante. Steve esiste un modo per modificare questo comportamento oppure l'intento di eseguire processi di esecuzione prolungata su un ruolo di lavoro con una coda o qualche altro metodo di attività incrociata? –

+0

Al momento non c'è modo di cambiarlo. Tuttavia, se è possibile inviare periodicamente i dati attraverso la connessione TCP, rimarrà aperto. (Sono solo le connessioni _idle_ che vengono interrotte.) – smarx