4

当我尝试连接到不可用的机器时,我得到一个 EndpointNotFoundException 但它需要的时间太长(大约 20 秒)。设置 closeTimeout、openTimeout、receiveTimeout 或 sendTimeout 无效。我能早点得到那个例外吗?

4

3 回答 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

找到的解决方案是villintehaspamwallismark的答案的混合。我创建了一个本地方法,它异步调用远程方法void IsOk()并等待几秒钟。如果花费的时间太长,我会中止线程。

于 2010-05-24T10:06:16.600 回答