当我尝试连接到不可用的机器时,我得到一个 EndpointNotFoundException 但它需要的时间太长(大约 20 秒)。设置 closeTimeout、openTimeout、receiveTimeout 或 sendTimeout 无效。我能早点得到那个例外吗?
问问题
237 次
3 回答
2
您始终可以尝试在单独的线程中连接,并在主线程上设置一个带有所需超时的计时器。如果您的工作线程在您的超时时间内没有完成,那么您可以假设它不会响应。
于 2010-01-13T11:00:08.127 回答
2
我们正在使用运行良好的 EnterpriseLibrary ConnectionMonitor 块,您可以使用它定义自己的策略来确定连接可用性,但我们只是使用包装盒中的那个。
该默认代码(确实在后台线程上运行......由块处理)在内部使用它:
public bool IsAlive(string hostnameOrAddress)
{
bool alive = false;
try
{
Uri address = new Uri(hostnameOrAddress);
HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(address);
request.Timeout = 5000;
using (HttpWebResponse response = (HttpWebResponse) request.GetResponse())
{
alive = DoesResponseStatusCodeIndicateOnlineStatus(response);
}
}
catch (WebException wex)
{
alive = DoesWebExceptionStatusIndicateOnlineStatus(wex);
}
return alive;
}
看看块本身,看看你是否可以在你的项目中使用它,或者获得一些关于如何解决你的特定问题的想法。(从内存中,该块是 SCSF 智能客户端软件工厂的一部分)
不过我的理解是,您将需要执行某种后台线程或自己等待超时。在调用超时之前,WCF 不知道终结点不存在。
于 2010-02-08T03:07:53.687 回答
0
找到的解决方案是villintehaspam和wallismark的答案的混合。我创建了一个本地方法,它异步调用远程方法void IsOk()并等待几秒钟。如果花费的时间太长,我会中止线程。
于 2010-05-24T10:06:16.600 回答