none
WCF通信通道出错后,如何重新连接? RRS feed

  • 问题

  • 当用户长时间不操作时,客户端再次使用时,WCF可能会因超时出现错误:

    套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。本地套接字超时是“00:01:59.9484601”。

    为此,我在获取服务端数据前,增加了类似如下语句:

    If client.State = ServiceModel.CommunicationState.Faulted Then client = New ServiceClient

    client.GetData()

    但因为 New 后,可能未必马上Opened,因此,后续语句并不能获取数据。需再次调用后,才能正确执行。

    请问:我重新建立代理这种方式正确吗?该如何一次性调用成功呢(就象没发生超时错误一样)?


    韩立学


    2015年12月26日 3:00

答案

  • 没写过vb,本来想查一下语法写一下的,但是,怕误导你,就用C#写了,相信你可以翻译成vb的。

    ServerClient client=null;

    Data data=null;

    try{

    client=new ServerClient();

    data=client.GetData();

    }catch(exception){

    }finally

    {

    client.close();

    }

    //do something here to data

    这段代码只是事例,正常情况下可以使用,但是,考虑到现实情况,比如更不常见的网络异常之类的,需要根本实现情况进行修改。

    • 已标记为答案 大海怪 2015年12月26日 10:06
    2015年12月26日 3:58
  • If client.State = ServiceModel.CommunicationState.Faulted Then client = New ServiceClient

    原因找到了,在Client调用GetData()之前,其 State是不改变的,也就是说上述语句未起到作用。

    改为如下即可:

     Try
                client.GetData
            Catch ex As Exception
                client.Abort()
                client= New ServiceClient
                client.GetData
            End Try


    韩立学


    • 已编辑 大海怪 2015年12月26日 7:54
    • 已标记为答案 大海怪 2015年12月26日 7:55
    2015年12月26日 7:54

全部回复

  • 没写过vb,本来想查一下语法写一下的,但是,怕误导你,就用C#写了,相信你可以翻译成vb的。

    ServerClient client=null;

    Data data=null;

    try{

    client=new ServerClient();

    data=client.GetData();

    }catch(exception){

    }finally

    {

    client.close();

    }

    //do something here to data

    这段代码只是事例,正常情况下可以使用,但是,考虑到现实情况,比如更不常见的网络异常之类的,需要根本实现情况进行修改。

    • 已标记为答案 大海怪 2015年12月26日 10:06
    2015年12月26日 3:58
  • 非常感谢您的回复!

    象您这样,每次重新建立,然后关闭,是不是效率会比较低?

    我是这样的:

    Public client.State As New ServiceClient

    Private Sub GetData()

    If client.State = ServiceModel.CommunicationState.Faulted Then client = New ServiceClient

    client.GetData()

    End Sub

    但这样,超时后Client会自动断开。


    韩立学

    2015年12月26日 4:27
  • If client.State = ServiceModel.CommunicationState.Faulted Then client = New ServiceClient

    原因找到了,在Client调用GetData()之前,其 State是不改变的,也就是说上述语句未起到作用。

    改为如下即可:

     Try
                client.GetData
            Catch ex As Exception
                client.Abort()
                client= New ServiceClient
                client.GetData
            End Try


    韩立学


    • 已编辑 大海怪 2015年12月26日 7:54
    • 已标记为答案 大海怪 2015年12月26日 7:55
    2015年12月26日 7:54