Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > WebRequest.Timeout


Автор: Kefir 9.6.2007, 10:07
есть программка, где надо постонно проверять наличие интернета. делаю очень просто - через WebRequest посылаю запрос на нужный сайт. Коли ответ есть - значит и интернет есть. Код:
Код

            WebRequest wRequest = WebRequest.Create(URL);
            // set request timeout to 4 seconds (4000 milliseconds)
            wRequest.Timeout = 4000;
            WebResponse wResponse;
            try
            {
                wResponse = wRequest.GetResponse();
                wResponse.Close();
                wRequest = null;
                return true;
            }
            catch
            {
                wResponse = null;
                wRequest = null;
                return false;
            }

вот. всё вроде убийственно просто и должно работать. но по непонятным причинам в одном месте с вифи интернетом оно даёт сбой и возвращает периодически false. из-за этого отменяется синхронизация БД и файлов программы с сервером. Что самое обидное - у меня такое впечатление, что он просто не ждёт Timeout и просто не успевает получить ответ. Ставил таймаут и на 40 секунд - никакой разницы. Доки читал - вроде написано что таймаут работает только если запрос синзронный - GetResponse вроде именно синхронная функция.
Так вот собственно что надо - или заставить нормально работать таймаут у запроса, или сделать как-нибудь по-другому. Предложения? Идеи?

Автор: Kvazilol 10.6.2007, 01:38
http://www.codeproject.com/cs/internet/internetconnection_status.asp
вроде оно?
Код

try
    {
        // Create an HTTP Web request
        // to an Uri that's always available.
        HttpWebRequest request = (HttpWebRequest) 
           HttpWebRequest.Create(this._alwaysAvailableUrl);

        // Perform GET
        HttpWebResponse response = 
           (HttpWebResponse) request.GetResponse();
        if (HttpStatusCode.OK == response.StatusCode)
        {
            // HTTP = 200, close the request and return true
            response.Close();
            e.Result = true;
        }
        else
        {
            // Other status; return false
            e.Result = false;
        }
    }
    catch (WebException)
    {
        // Deffinitely offline
        e.Result = false;
    }
}

Автор: Kefir 10.6.2007, 08:58
а какая собственно принципиальная разница между моим кодом и тем что привёл ты? (я в танке)

Автор: v2v 10.6.2007, 10:17
Я так понял тебе инет нужен для синхронизации БД с сервером?
Ну так а что за сервер? ТЫ от него посылки тоже через ВебРеспонс получаешь? или как то подругому, так и проверяй наличия соединения с сервером по другому.


Автор: Kefir 10.6.2007, 11:13
v2v, инет нужен НЕ ТОЛЬКО для синхронизации БД. проверка должна в принципе подтверждать что сайт www.company_site.com отвечает. Всё. Проблема в том, что таймаут почему-то не пашет.
я вообще не понимаю в чём суть твоего поста - я про фому, ты про ерёму. что значит проверять по другому? ну напиши как. и какая разница какой сервер? я же говорю - надо проверять есть интернет или нет.

Автор: stab 10.6.2007, 11:20
false оно может вернуть если произошло исключение. закрадывается вопрос: а что за исключение на том компе происходит?

Автор: Kefir 11.6.2007, 10:23
гм... забыл совсем... мне в общем к терминалу надо съездить и в логе глянуть для полной уверенности. как только так сразу отпишусь.

Автор: stab 11.6.2007, 12:51
отпишись, мне уже самому интересно  smile 

Автор: Kefir 11.6.2007, 17:52
вот сижу у терминала.
исключение:

System.Net.WebException: The remote server returned an error: (404) Not Found.
   at System.Net.HttpWebRequest.GetResponse()
   at ERD.AdminForm.IsConnectionAvailable(String URL) in xxx:line yyy

скажу так - очень странно это. ибо урл всё время один и тот же. оно постоянно в онлайне. это раз. два. такая проблема только на одном терминале (интернет - вифишка - как и везде). работает инет отрадно, но, видно, что-то невпорядке. спешу заметить - сайт в оффлайн не уходит и уходить не собирается.

а теперь вопрос - мысли и соображения по этому поводу? единственное, что приходит в голову - посылать запрос не один раз, а несколько. хотя, коненчно, очень странное решение (как и сама проблема). есть ли что-нибудь покрасивее (в плане выхода из этой ситуёвины)?

Автор: tol05 11.6.2007, 18:35
вот еще http://www.codeproject.com/cs/internet/Crawler.asp?df=100&forumid=281712&exp=0&select=1773278 можешь почитать

Автор: stab 12.6.2007, 07:28
мистика. прокси может какой затесался? модификации LSP?

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

Автор: Kefir 12.6.2007, 10:26
tol05, эмм... а в чём, собственно, фишка? я может не понял - а что там смотреть? Там (почти) точно также использован WebRequest. И написан класс MyWebRequest для обхода синхронности GetResponse. Или я чего-то там не углядел?..


cully, странно то именно то, что 404 возвращается абсолютно хаотично - такое впечатление, то функция содержит только return rand()%2  smile . То есть при синхронизации возвращает false то на 3%, то на 8%, то на 6% и т.д. Вот это мне и непонятно. То есть какое-то нестабильное поведение у неё. Насчёт разных урлов - я сначала наверное попробую делать несколько запросов на сервер (ибо мне нужен только он), если не пройдёт такой фокус, то буду делать разные урлы.

В общем, пока помечаю вопрос решённым. Проблема ясна.
Обязательно отпишусь.

Автор: stab 12.6.2007, 11:35
Kefir, из IE пробовал этот урл долбить с такой же периодичностью?

Автор: Kefir 12.6.2007, 19:22
нет, не пробовал.
в общем после внедрения технологии множественного запроса (на три разных урла) всё стало работать нормально. проверяет хорошо. пока сбоев не замечено.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)