2012-04-16 15 views
5

私はWCF(コールバック契約を使用)とnetTcpBindingを使用してチャットアプリケーションを作成しています。 私はWindowsサービスとしてこのサービスをホストしており、クライアントアプリケーション経由で他のコンピュータ からアクセスしています。netTcpを使用したWCFコールバックサービス10分後のバインドタイムアウト

私が直面している問題は、クライアント接続が の後にフォールト状態になることです。これは何らかのタイムアウトが発生しているようです。 私はすでに受信タイムアウトを増やして、サービスとクライアントの両方でタイムアウトを送信しようとしましたが、動作しませんでした。

このタイムアウト期間を長くするために、どの設定を変更する必要がありますか?アプリケーション、サービス、またはクライアントはどれですか?続き

は私のコンフィギュレーションファイル、

サービス

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

クライアント

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

感謝しています。

+0

あなたは-1にreceivetimeoutの設定しようとしています。 http://msdn.microsoft.com/en-us/library/ms824661.aspx無限と呼ばれる無限 –

+0

これも試してみてくださいhttp://nogeekhere.blogspot.com/2009/04/why-will-wcf-client-be-disconnected.html –

+0

ありがとうShoaib、私は無限を使用しようとしましたが、有効なものとして受け入れませんでした設定ファイルの値。その理由は何ですか?どのような方法でも、私はサービスが5分ごとに各クライアントをリフレッシュするように小さな回避策をとった。しかし、私は構成を介してこれを処理する方法があるはずだと思います。 – user501579

答えて

4

この場合のタイムアウトは、バインディング内でreceiveTimeoutとデュプレックスメッセージングで使用される信頼性の高いセッションで両方とも定義されます。正しい解決策はタイムアウトを増やすことではなく、いくつかのping/keep aliveメッセージを実装することです。その理由は、タイムアウトを長くすると、失敗したクライアントに対して接続を開いたままにするからです。

+0

WCFは独自のキープアライブメッセージングを提供していますが、どの値を使用する必要があるのか​​、2009年以降に変更されているのかわかりません: "ドキュメントによれば、信頼できるセッションは無活動タイムアウトの半分後にキープアライブメッセージを送信します。残念ながら、予想される動作は実際の動作と同じではありませんでした。Receive Timeoutの動作はキープアライブの動作をオーバーライドします。 "http://smartasses.be/2009/01/26/wcf-reliable-session-and-keep-alives – Cel

1

クライアントコールサンプル(サービスコールの例)を送信できますか?ここで起こるのは、クライアントを正しく閉じることができず、サービス側で最大セッションに達することです。
net.tcpバインディングを使用するのがhttpと異なることに注意する必要があります。

System.ServiceModelパフォーマンスカウンター(http://msdn.microsoft.com/en-us/library/ms750527.aspx)を使用して、10分後に何が起きているかを確認できます(未処理のコール数、サービス数インスタンス、等。)

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

関連する問題