2

我有一个服务器,它从多个系统接收数据,将它们添加到数据库并使用最新接收的数据更新另一个应用程序(客户端)。这个客户端(都在同一台计算机上运行)以有组织的形式呈现数据并对其进行一些处理。此外,它可以使用服务器在数据库中执行查询。所以它使用来自服务器的函数来获取历史数据。

对于此通信,我使用 WCF,并且服务器在 .config 中声明如下:

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="ServiceName">
        <endpoint binding="netTcpBinding" contract="IServiceName">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:5050/msservice"/>
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>

客户端使用以下配置:

<system.serviceModel>
    <bindings>
        <netTcpBinding>
            <binding name="NetTcpBinding_IService" closeTimeout="00:02:00" openTimeout="00:02:00" receiveTimeout="00:10:00" sendTimeout="00:02:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxConnections="10" maxBufferSize="2147483647" maxBufferPoolSize="2147483647">
                <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
                <security mode="Transport">
                    <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>
                    <message clientCredentialType="Windows"/>
                </security>
            </binding>
        </netTcpBinding>
    </bindings>
    <client>
        <endpoint address="net.tcp://localhost:5050/msservice" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IService" contract="Server.IService" name="NetTcpBinding_IService">
            <identity>
                <dns value="localhost"/>
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

当客户端创建服务(连接到服务器)时,它使用称为订阅的服务功能,该功能将客户端包括在服务器连接的客户端列表中。当新数据到达时,它会在所有客户端中引发一个事件。

但是,在客户端不活动之后(因为它不会定期向服务器发送消息,即使相反的情况发生的频率很高),它也会进入故障状态。发生这种情况时,服务器函数的每个客户端调用都会引发异常。

无论是在服务器端还是客户端,我都希望在通道关闭时自动重新连接,以保证客户端仍然接收来自客户端的消息,并且来自客户端的函数调用由服务器执行。

非常感谢你的帮助!

4

1 回答 1

0

负载均衡器在 1 分钟后关闭空闲连接。因此,如果您想保持连接处于活动状态,那么应该始终进行一些通信

1) 第一个选项是每分钟调用一次操作。

2)如果这是不可能的,那么

  • 在绑定上启用可靠消息传递,WCF 基础结构将处理它。
  • 您可以配置 inactivityTimeout 和 receiveTimeout 以确保通道保持打开状态。
  • 两个超时都必须设置,否则如果任何一个超时,通道就会出现故障。
  • 可靠会话配置后,如果连接变为空闲状态,WCF 将生成流量以使其保持打开状态。
于 2013-11-26T13:28:06.617 回答