2012-04-16 34 views
5

Tôi đang tạo một ứng dụng trò chuyện với WCF (sử dụng hợp đồng gọi lại) và netTcpBinding. Tôi đang lưu trữ dịch vụ dưới dạng dịch vụ cửa sổ và truy cập dịch vụ từ các máy tính khác qua ứng dụng khách.Dịch vụ gọi lại WCF với netTcp Hết thời gian chờ sau 10 phút

Sự cố mà tôi đang gặp phải là kết nối máy khách đến trạng thái Lỗi sau 10 phút dường như là một loại thời gian chờ xảy ra. Tôi đã thử tăng thời gian chờ đã nhận và gửi thời gian chờ trong cả dịch vụ và ứng dụng khách nhưng không hoạt động.

tôi nên thay đổi cài đặt nào để tăng khoảng thời gian chờ này và ứng dụng, dịch vụ hoặc ứng dụng nào?

Sau đây là file cấu hình của tôi,

Dịch vụ

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

Khách hàng

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

Cảm ơn.

+0

bạn đã thử đặt getTimeout thành -1. http://msdn.microsoft.com/en-us/library/ms824661.aspx. được gọi là vô cùng –

+0

thử điều này cũng như http://nogeekhere.blogspot.com/2009/04/why-will-wcf-client-be-disconnected.html –

+0

Cảm ơn Shoaib, tôi đã thử sử dụng vô hạn nhưng không chấp nhận là hợp lệ giá trị trong tệp cấu hình. bất kỳ lý do cho điều đó? bất kỳ cách nào, tôi đã làm một workaround nhỏ để các dịch vụ sẽ làm mới mỗi khách hàng mỗi 5 phút. Nhưng tôi đoán có một cách để xử lý điều này thông qua các cấu hình. – user501579

Trả lời

4

Thời gian chờ trong trường hợp này được xác định bởi cả receiveTimeout trong phần ràng buộc và inactivityTimeout trong phiên đáng tin cậy được sử dụng để nhắn tin hai mặt. Giải pháp chính xác không tăng thời gian chờ nhưng thực hiện một số ping/giữ tin nhắn còn sống. Lý do là việc tăng thời gian chờ sẽ giữ cho các kết nối mở cho các khách hàng không thành công.

+0

WCF có thể cung cấp tin nhắn riêng của mình mặc dù, nhưng Im không chắc chắn những giá trị cần phải được sử dụng và nếu điều này đã thay đổi kể từ năm 2009 ?: Theo tài liệu, một phiên đáng tin cậy sẽ gửi một thông điệp giữ sống sau một nửa thời gian chờ không hoạt động. Thật không may là hành vi mong đợi không giống như hành vi thực tế .. hành vi Thời gian chờ nhận hành vi vượt quá hành vi tiếp tục tồn tại "http://smartasses.be/2009/01/26/wcf-reliable-session-and-keep-alives – Cel

1

Bạn có thể gửi mẫu cuộc gọi của khách hàng (ví dụ cuộc gọi dịch vụ) không. Điều có thể xảy ra ở đây là bạn không đóng ứng dụng khách chính xác và bạn đạt được các phiên tối đa ở phía dịch vụ.
Bạn phải biết rằng việc sử dụng ràng buộc net.tcp khác với http.

Bạn có thể sử dụng bộ đếm hiệu năng System.ServiceModel (http://msdn.microsoft.com/en-us/library/ms750527.aspx) và xem sau 10 phút những gì đang diễn ra (số lượng cuộc gọi nổi bật, số lượng dịch vụ các trường hợp, v.v ..)

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

Các vấn đề liên quan