2012-04-16 15 views
5

Ich erstelle eine Chat-Anwendung mit WCF (mit Callback-Vertrag) und netTcpBinding. Ich hosste den Dienst als Windows-Dienst und den Zugriff von anderen Computern über die Client-Anwendung.WCF Callback Service mit netTcp Binding Timeout nach 10 Minuten

Das Problem, dass ich jetzt konfrontiert ist, ist die Clients Verbindung kommt zu einem Fehlerzustand nach 10 Minuten, die eine Art von Zeitüberschreitung auftreten scheint. Ich habe bereits versucht, das empfangene Timeout zu erhöhen und Timeout sowohl im Service als auch im Client zu senden, hat aber nicht funktioniert.

Welche Einstellung sollte ich ändern, um diese Zeitüberschreitung zu erhöhen und in welcher Anwendung, Service oder Client?

Im Folgenden sind meine Konfigurationsdateien,

Dienst

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

Kunde

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

Dank.

+0

haben Sie receiveTimeout auf -1 versucht Einstellung. http://msdn.microsoft.com/en-us/library/ms824661.aspx. genannt Unendlichkeit –

+0

versuchen Sie dies auch http://nogeekhere.blogspot.com/2009/04/why-will-wcf-client-be-disconnected.html –

+0

Danke Shoaib, versuchte ich mit unendlich, aber nicht als gültig akzeptiert Wert in der Konfigurationsdatei. ein Grund dafür? Wie auch immer, ich habe eine kleine Problemumgehung gemacht, so dass der Dienst jeden Client alle 5 Minuten aktualisiert. Aber ich denke, es sollte einen Weg geben, dies durch Konfigurationen zu handhaben. – user501579

Antwort

4

Das Timeout ist in diesem Fall sowohl durch receiveTimeout in der Bindung als auch durch inactivityTimeout in der zuverlässigen Sitzung definiert, die für Duplex-Messaging verwendet wird. Die richtige Lösung besteht nicht darin, das Zeitlimit zu erhöhen, sondern einige Ping/Keep Alive-Nachrichten zu implementieren. Der Grund dafür ist, dass ein längeres Timeout Verbindungen für fehlgeschlagene Clients offen hält.

+0

WCF kann zwar eigene Keepalive-Nachrichten bereitstellen, aber ich bin nicht sicher, welche Werte verwendet werden müssen und ob sich dies seit 2009 geändert hat: "Laut der Dokumentation würde eine Reliable Session eine Keep-Alive-Nachricht nach der Hälfte des Inactivity Timeout senden. Leider war das erwartete Verhalten nicht das gleiche wie das tatsächliche Verhalten. Das Verhalten "Empfangs-Timeout" überlagerte das Keep-Alive-Verhalten "http://smartasses.be/2009/01/26/wcf-reliable-session-and-keep-alives – Cel

1

Können Sie ein Clientaufrufbeispiel (Serviceaufrufbeispiel) posten. Was hier passieren könnte, ist, dass Sie den Client nicht korrekt schließen und die maximalen Sitzungen auf der Serviceseite erreichen.
Sie müssen sich bewusst sein, dass die Verwendung von net.tcp Bindung ist anders als http.

Sie können System.ServiceModel Leistungsindikatoren verwenden (http://msdn.microsoft.com/en-us/library/ms750527.aspx) und nach 10 Minuten sehen, was passiert (Anzahl der ausstehenden Anrufe, Anzahl der Dienste Instanzen, etc ..)

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

Verwandte Themen