none
如何判断WSDualHttpBinding连接中断 RRS feed

  • 问题

  • 服务端接受WSDualHttp、TCP和PIPE三种方式连接,客户端连接到服务器后,服务端保存客户端的上下文,然后循环快速地回调客户端发送数据。

    如果以TCP和PIPE方式连接的客户端,如果网络中断或者其他的,服务端很快速地抛出通道异常而删除保存的此上下文,而不再向此客户端发送数据。

    但是以WSDualHttp方式连接的客户端,客户端网络中断后,服务端不会捕捉到任何异常,扔然向此客户端发送数据,不知道是不是缓冲区满了的原因,一会儿所有客户端都收不到数据,并且客户端无法连接到服务,机器的CPU占用也会变得非常高。

    请问这是什么原因,如何解决这样的问题呢?

    请各位大虾不吝赐教。。。


    补充一下:以上的情况是在本地测试的结果,是一台机器的测试情况。但是如果把服务放到机房的服务器上,居然无反应,也没有超时异常,什么反应都没有,我把路由器端口映射、DMZ都设置了也同样无反应。我把客户端放到同一个机房的另一个服务器上,也是同样的结果,完全无反应,服务也没有显示收到了连接。

    很奇怪的是,我一开始把服务放到服务器上的时候,由于没有安全验证,连接的时候还提示我服务端没有做安全验证的意思,可是把传输安全取消了,就是以上的情况,什么反应也没有了,也不超时。

    这是怎么回事呢?

    补充的也是WSDualHttp的情况,TCP连接正常。
    2011年12月23日 5:27

全部回复

  • 我没使用过这个绑定做测试。所以不好下结论。

    1.先检查一下是否有内存泄露,连接是否关闭

    2.最大连接数量,是否做了限制,WCF的限流设置

    3.客户端发送的请求,服务应该收到了吧,你可以加一个普通的 请求/应答模式的WCF服务,部署到DMZ测试一次。看看是不是正常


    Frank Xu Lei--谦卑若愚,好学若饥
    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2011年12月26日 5:25
    版主
  • 我没使用过这个绑定做测试。所以不好下结论。

    1.先检查一下是否有内存泄露,连接是否关闭

    2.最大连接数量,是否做了限制,WCF的限流设置

    3.客户端发送的请求,服务应该收到了吧,你可以加一个普通的 请求/应答模式的WCF服务,部署到DMZ测试一次。看看是不是正常


    Frank Xu Lei--谦卑若愚,好学若饥
    老徐的网站】:http://www.frankxulei.com/

     

     

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛


    1、这个DEMO是服务器端不间断回调,只要客户端在线就一直不断地回调客户端。所以客户端的超时设置我设为了最大值。在非WSDaulHttp连接下,如果客户端断线,那么服务器端会有异常从而中断服务回调此客户端,但是在WSDaulHttp连接下,没有这个异常抛出,就算客户端不在线了,也一直不断地回调客户端,且没有超时异常。

    2、我没有做限流设置,并且我启动的客户端也很少,只有两三个,或者三四个,这个应该不会达到了最大连接数量。

    3、奇怪的是,WSDualHttp连接,客户端发送的请求,服务根本没有收到。改用普通的请求/应答模式,用WSDualHttp连接,服务也收不到请求,而用BasicHttpBinding就正常。

    难道是我的连接方式不对?我贴出我用普通的请求/应答模式下的连接代码:

     

    EndpointAddress ep = new EndpointAddress("http://Server/Test");
    
    WSDualHttpBinding binding = new WSDualHttpBinding();
    OptionalReliableSession rs = new OptionalReliableSession();
    rs.Enabled = false;
    binding.ReliableSession = rs;
    binding.Security.Mode = WSDualHttpSecurityMode.None;
    
    ITest proxy = ChannelFactory<ITest>.CreateChannel(binding, ep);
    bool result = proxy.GetResult();
                
    Console.WriteLine(result);

     



    2011年12月26日 10:41
  •  

    对于WsDualHttpBinding, 你应该启用可靠的会话,默认是没有启用,你可以设置下面的代码设置。

    OptionalReliableSession rs = new OptionalReliableSession();
    rs.Enabled = true;

    但你的代码里面没有设置启用可靠会话。

     

     


    Please mark the replies as answers if they help or unmark if not. If you have any feedback about my replies, please contact msdnmg@microsoft.com Microsoft One Code Framework
    2011年12月30日 6:00
    版主