当我尝试连接到不可用的机器时,我得到一个EndpointNotFoundException,但它花了太长时间(大约20秒)。设置closeTimeout,openTimeout,receiveTimeout或sendTimeout无效。 我可以提前得到那个例外吗?
答案 0 :(得分:2)
您始终可以尝试在单独的线程中进行连接,并在主线程上使用具有所需超时的计时器。如果您的工作线程未在超时内完成,那么您可以认为它不会响应。
答案 1 :(得分: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不知道端点不存在。
答案 2 :(得分:0)
找到的解决方案是 villintehaspam 和 wallismark 的答案。 我创建了一个本地方法,异步调用远程方法 void IsOk()并等待几秒钟。如果需要太长时间,我就会中止该线程。