Oma*_*eji 11 .net wcf callback publish-subscribe
我编写了一个系统,它使用带有回调的Duplex NetTcp通道作为发布/订阅服务器.
如果一段时间后没有发送连接,或者无限期地维护回调管道,我是否必须担心回调超时?
Moh*_*and 10
回调将无法无限期维护,它将查找您在配置中设置的超时值.如果启用可靠会话,则可以设置客户端的非活动超时.您可以配置这样的超时:
<netTcpBinding>
<binding
closeTimeout="00:01:00"
openTimeout="00:01:00"
receiveTimeout="00:10:00"
sendTimeout="00:01:00"
transactionFlow="false"
......>
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="true" />
</binding>
</netTcpBinding>
Run Code Online (Sandbox Code Playgroud)
达到这些值并且仍然没有响应时,您的通信通道会出现故障,您需要重新创建客户端代理才能使用该服务.默认值receiveTimeout是10分钟,所以你可以增加,但也要确保增加你的inactivityTimeout,你inactivityTimeout应该大于你的receiveTimeout.
编辑:
您可以receiveTimeout根据客户端发送回服务器的值以编程方式继续更改,关键是在服务和客户端上保持新的超时值相同.您将在客户端上执行此操作(我正在使用我正在使用WCF进行聊天服务并使用Silverlight客户端进行操作的示例):
//Create different clients dynamically
MyChatServiceClient _client1 = new MyChatServiceClient( "NetTcpBinding_IMyChatService_1");
MyChatServiceClient _client2 = new MyChatServiceClient( "NetTcpBinding_IMyChatService_2");
Run Code Online (Sandbox Code Playgroud)
在客户端配置中:
<!--In your config file, define multiple endpoints/behaviors with different values based on your needs-->
<bindings>
<customBinding>
<binding name="NetTcpBinding_IMyChatService_1" receiveTimeout="00:01:00" ...>
<binaryMessageEncoding />
<tcpTransport maxReceivedMessageSize="283647" maxBufferSize="283647" />
</binding>
<binding name="NetTcpBinding_IMyChatService_2" receiveTimeout="00:22:00" ...>
<binaryMessageEncoding />
<tcpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="net.tcp://192.168.1.51:4520/VideoChatServer/"
binding="customBinding" bindingConfiguration="NetTcpBinding_IMyChatService_1"
contract="IMyChatService" name="NetTcpBinding_IMyChatService_1" />
<endpoint address="net.tcp://192.168.1.51:4522/VideoChatServer/"
binding="customBinding" bindingConfiguration="NetTcpBinding_IMyChatService_2"
contract="IMyChatService" name="NetTcpBinding_IMyChatService_2" />
</client>
Run Code Online (Sandbox Code Playgroud)
因此,您可以在客户端或服务器上的配置中定义多个端点或绑定,然后根据应用程序中的任何事件,您可以实例化_clientProxyX以使用_serviceInstanceX,它将具有不同的绑定/端点值,但与您之前的服务实例具有相同的合同.在上面的示例中,第一个绑定的超时为1分钟,第二个绑定的超时为2分钟.需要考虑的重要一点是,如果您希望重新创建这样的新客户端代理,那么您需要拆除旧的客户端代理并创建一个新客户端代理,这有效地将客户端与服务断开连接,至少是暂时的.
您也可以修改这些值(openTimeout,closeTimeout程序都在服务器上实例化一个新的服务时,主机等).您可以根据您在配置中定义的绑定配置之一创建新主机,也可以以编程方式创建新配置,如下所示:
var host = new ServiceHost(typeof(MyChatService));
var webHttpBinding = new System.ServiceModel.WebHttpBinding();
//Modify new timeout values before starting the host
webHttpBinding.OpenTimeout = new TimeSpan(1, 0, 0);
webHttpBinding.CloseTimeout = new TimeSpan(1, 0, 0);
host.AddServiceEndpoint(webHttpBinding, "http://192.168.1.51/myService.svc");
//start the host after necessary adjustments
host.Open();
Run Code Online (Sandbox Code Playgroud)
我知道这看起来很混乱,但关键是WCF为您提供了很多灵活性,能够以编程方式修改绑定配置.一定要检查出这个伟大的答案如何修改您的WCF的配置文件.您还可以轻松地以编程方式创建整个服务配置.
| 归档时间: |
|
| 查看次数: |
10408 次 |
| 最近记录: |