积极答复者
请问是否有人碰到过这样的问题:一次TimeoutException之后,客户端就再也连不上了

问题
-
当远程的WCF服务器正在启动中还没有启动完的时候,从客户端发出一次检索请求,运气不好的话,就会画面死翘翘,到达规定的时间之后,产生一个TimeoutException。
这个本身不是很大的问题,只要等待超时告诉用户暂时连不上服务器就行了。问题在于即使服务器已经正常启动完了,别的客户端都可以正常访问了,这台客户端不管发几次请求都会Timeout,除非重新启动客户端。
使用HttpAnalyzer监视发现http请求根本就没有发出去。
Client对象用完了我是Close了,如果捕获异常的时候我也尝试着Abort了,但是还是没办法让该客户端从一次Timeout中恢复正常。
app_tracelog.svclog能看出来是TimeoutException,但是也看不出原因。
请问有人碰到过类似的问题么,帮忙指点一下调查的方向。谢谢
答案
全部回复
-
我的做法是:定期心跳检查服务连接,如果有错,将重建客户端连接.
超时异常以后,客户端通道会被回收的。可以重新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/
-
谢谢各位的回答,每次函数的执行我都是重新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();
}
}
}
这种写法有什么隐藏的问题吗