我有一个服务器,它从多个系统接收数据,将它们添加到数据库并使用最新接收的数据更新另一个应用程序(客户端)。这个客户端(都在同一台计算机上运行)以有组织的形式呈现数据并对其进行一些处理。此外,它可以使用服务器在数据库中执行查询。所以它使用来自服务器的函数来获取历史数据。
对于此通信,我使用 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>
当客户端创建服务(连接到服务器)时,它使用称为订阅的服务功能,该功能将客户端包括在服务器连接的客户端列表中。当新数据到达时,它会在所有客户端中引发一个事件。
但是,在客户端不活动之后(因为它不会定期向服务器发送消息,即使相反的情况发生的频率很高),它也会进入故障状态。发生这种情况时,服务器函数的每个客户端调用都会引发异常。
无论是在服务器端还是客户端,我都希望在通道关闭时自动重新连接,以保证客户端仍然接收来自客户端的消息,并且来自客户端的函数调用由服务器执行。
非常感谢你的帮助!