Как найти плохие конечные точки раньше? - PullRequest
4 голосов
/ 13 января 2010

Когда я пытаюсь подключиться к недоступной машине, я получаю исключение EndpointNotFoundException, но это занимает слишком много времени (около 20 секунд). Установка closeTimeout, openTimeout, receiveTimeout или sendTimeout не имеет никакого эффекта. Могу ли я получить это исключение раньше?

Ответы [ 3 ]

2 голосов
/ 08 февраля 2010

Мы используем блок 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 Smart Client Software Factory)

Однако я понимаю, что вам понадобится выполнить какую-то фоновую работу или подождать тайм-аут самостоятельно. WCF не знает, что конечная точка не существует, пока не истечет время ожидания вызова.

2 голосов
/ 13 января 2010

Вы всегда можете попытаться подключиться в отдельном потоке и иметь таймер с желаемым временем ожидания в главном потоке.Если ваш рабочий поток не завершится в течение вашего тайм-аута, вы можете предположить, что он не будет отвечать.

0 голосов
/ 24 мая 2010

Найденное решение представляет собой смесь ответов villintehaspam и wallismark .Я создал локальный метод, который вызывает удаленный метод void IsOk () асинхронно и ждет несколько секунд.Если это занимает слишком много времени, я прерываю поток.

...