none
请问是否有人碰到过这样的问题:一次TimeoutException之后,客户端就再也连不上了 RRS feed

  • 问题

  • 当远程的WCF服务器正在启动中还没有启动完的时候,从客户端发出一次检索请求,运气不好的话,就会画面死翘翘,到达规定的时间之后,产生一个TimeoutException。

     

    这个本身不是很大的问题,只要等待超时告诉用户暂时连不上服务器就行了。问题在于即使服务器已经正常启动完了,别的客户端都可以正常访问了,这台客户端不管发几次请求都会Timeout,除非重新启动客户端。

    使用HttpAnalyzer监视发现http请求根本就没有发出去。

    Client对象用完了我是Close了,如果捕获异常的时候我也尝试着Abort了,但是还是没办法让该客户端从一次Timeout中恢复正常。

    app_tracelog.svclog能看出来是TimeoutException,但是也看不出原因。

     

    请问有人碰到过类似的问题么,帮忙指点一下调查的方向。谢谢

     

     

    2010年8月27日 13:21

答案

  • 你好,

    你的代码没错。貌似.net底层httprequest就这么实现的。若访问网络资源失败并返回某写错误代码时,未来一段时间内再次访问该资源,request不再重试,而是直接返回错误,不晓得有啥解决办法。或者你就弹出窗口,提示用户重启客户端吧。

     


    Mog Liang
    • 已标记为答案 cs.liwei 2010年8月31日 8:23
    2010年8月31日 7:13

全部回复

  • 在大多数情况下可以判断Channel.State的状态解决
    lcpking
    2010年8月28日 5:13
  • 我的做法是:定期心跳检查服务连接,如果有错,将重建客户端连接.
    2010年8月30日 2:06
  • 我的做法是:定期心跳检查服务连接,如果有错,将重建客户端连接.


    超时异常以后,客户端通道会被回收的。

    可以重新New一个实例


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    老徐的博客】:http://www.cnblogs.com/frank_xl/

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

    2010年8月30日 13:37
    版主
  • 谢谢各位的回答,每次函数的执行我都是重新New一个Client的实例

    甚至尝试用了下面的冗余重重的写法,来保证一次调用结束肯定关闭,不过仍然不行。

     

                MyWorkClient ts = new MyWorkClient();

                try

                {

                    ts.Work(out rspData, reqData);

                }

     

                catch (TimeoutException ex)

                {

                    if (null != ts)

                    {

                        ts.Abort();

                        if (ts.ChannelFactory.State != CommunicationState.Closed)

                        {

                            //ts.ChannelFactory.Close();

                            ts.ChannelFactory.Abort();

                        }

                        ts = null;

                    }

                    return false;

                    //throw;

                }

                finally

                {

                    if (null != ts)

                    {

                        ts.Close();

                        if (ts.ChannelFactory.State != CommunicationState.Closed)

                        {

                            ts.ChannelFactory.Close();

                        }

                    }

                }

     

    这种写法有什么隐藏的问题吗

     

     

    2010年8月31日 2:15
  • 你好,

    你的代码没错。貌似.net底层httprequest就这么实现的。若访问网络资源失败并返回某写错误代码时,未来一段时间内再次访问该资源,request不再重试,而是直接返回错误,不晓得有啥解决办法。或者你就弹出窗口,提示用户重启客户端吧。

     


    Mog Liang
    • 已标记为答案 cs.liwei 2010年8月31日 8:23
    2010年8月31日 7:13
  • 你好,

    你的代码没错。貌似.net底层httprequest就这么实现的。若访问网络资源失败并返回某写错误代码时,未来一段时间内再次访问该资源,request不再重试,而是直接返回错误,不晓得有啥解决办法。或者你就弹出窗口,提示用户重启客户端吧。

     


    Mog Liang

    谢谢。

    这么智能,简直无语了...还好这个错误发生的几率稍低...

    2010年8月31日 7:57