2012-04-16 11 views
5

Sto creando un'applicazione di chat con WCF (utilizzando il contratto di richiamata) e netTcpBinding. Sto ospitando il servizio come servizio Windows e accedendo da altri computer tramite l'applicazione client.Servizio di richiamata WCF con timeout di binding netTcp dopo 10 minuti

Il problema che sto affrontando ora è la connessione dei client arriva a uno stato di errore dopo 10 minuti che sembra essere una sorta di timeout che si verificano. Ho già provato ad aumentare il timeout ricevuto e a inviare il timeout sia nel servizio che nel client ma non ha funzionato.

quale impostazione devo modificare per aumentare questo periodo di timeout e in quale applicazione, servizio o client?

seguito sono i miei file di configurazione,

Servizio

<system.serviceModel> 
    <services> 
     <service behaviorConfiguration="PeerTalk.Service.ChatServiceBehavior" 
     name="PeerTalk.Service.ChatService"> 
     <endpoint address="" binding="netTcpBinding" bindingConfiguration="" 
      contract="PeerTalk.Service.ServiceContracts.IChat"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" 
      contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:7920/ChatService" /> 
      <add baseAddress="net.tcp://localhost:7921/ChatService" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="PeerTalk.Service.ChatServiceBehavior"> 
      <serviceMetadata httpGetEnabled="false" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <netTcpBinding> 
     <binding name="tcpBinding" 
       maxBufferSize="67108864" 
      maxReceivedMessageSize="67108864" 
      maxBufferPoolSize="67108864" 
      transferMode="Buffered" 
      closeTimeout="00:01:00" 
      openTimeout="00:01:00" 
      receiveTimeout="00:00:10" 
      sendTimeout="00:00:10" 
      maxConnections="100"> 
      <readerQuotas maxDepth="64" 
         maxStringContentLength="67108864" 
         maxArrayLength="67108864" 
         maxBytesPerRead="67108864" 
         maxNameTableCharCount="16384"/> 
      <security mode="Transport"> 
      <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
      <message clientCredentialType="Windows"/> 
      </security> 
      <reliableSession enabled="false" inactivityTimeout="00:01:00"/> 

     </binding> 
     </netTcpBinding> 
    </bindings> 
    </system.serviceModel> 

client

<system.serviceModel> 
    <bindings> 
     <netTcpBinding> 
     <binding name="NetTcpBinding_IChat" closeTimeout="00:01:00" openTimeout="00:01:00" 
      receiveTimeout="00:10:00" sendTimeout="00:00:10" transactionFlow="false" 
      transferMode="Buffered" transactionProtocol="OleTransactions" 
      hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="67108864" 
      maxBufferSize="67108864" maxConnections="10" maxReceivedMessageSize="67108864"> 
      <readerQuotas maxDepth="32" maxStringContentLength="67108864" 
      maxArrayLength="67108864" maxBytesPerRead="67108864" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:01:00" 
      enabled="false" /> 
      <security mode="Transport"> 
      <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
      <message clientCredentialType="Windows" /> 
      </security> 
     </binding> 
     </netTcpBinding> 
    </bindings> 
    <client>  
      <endpoint address="net.tcp://10.10.10.45:7921/ChatService" binding="netTcpBinding" 
       bindingConfiguration="NetTcpBinding_IChat" contract="PeerTalkService.IChat" 
       name="NetTcpBinding_IChat"> 
      </endpoint> 
    </client> 
    </system.serviceModel> 

Grazie.

+0

hai provato impostazione ReceiveTimeout a -1. http://msdn.microsoft.com/en-us/library/ms824661.aspx. chiamato infinity –

+0

prova anche questo http://nogeekhere.blogspot.com/2009/04/why-will-wcf-client-be-disconnected.html –

+0

Grazie Shoaib, ho provato a usare infinito ma non ho accettato come valido valore nel file di configurazione. qualche ragione per quello? in qualsiasi modo, ho fatto una piccola soluzione in modo che il servizio aggiorni ogni client ogni 5 minuti. Ma immagino che ci dovrebbe essere un modo per gestire questo attraverso le configurazioni. – user501579

risposta

4

Il timeout in questo caso è definito da receiveTimeout nel binding e inactivityTimeout nella sessione affidabile che viene utilizzata per la messaggistica duplex. La soluzione corretta non sta aumentando il timeout ma implementando alcuni messaggi ping/keep alive. Il motivo è che l'aumento del timeout manterrà le connessioni aperte per i client non riusciti.

+0

WCF può fornire la propria messaggistica keepalive, ma non sono sicuro di quali valori devono essere utilizzati e se questo è cambiato dal 2009 ?: "Secondo la documentazione una sessione affidabile invierà un messaggio keep-alive dopo la metà del timeout di inattività. Sfortunatamente il comportamento atteso non era lo stesso del comportamento attuale .. il comportamento di Timeout di ricezione ha annullato il comportamento keep-alive "http://smartasses.be/2009/01/26/wcf-reliable-session-and-keep-alives – Cel

1

È possibile registrare un esempio di chiamata del client (esempio di chiamata di servizio). Quello che potrebbe accadere qui è che non stai chiudendo il client correttamente e raggiungi il massimo delle sessioni dal lato del servizio.
È necessario essere consapevoli del fatto che l'utilizzo del binding net.tcp è diverso da http.

È possibile utilizzare i contatori delle prestazioni System.ServiceModel (http://msdn.microsoft.com/en-us/library/ms750527.aspx) e vedere dopo 10 minuti cosa sta accadendo (numero di chiamate in sospeso, numero di servizio casi, ecc ..)

http://dkochnev.blogspot.com/2011/06/wcf-framework-40-monitoring-service.html

Problemi correlati