HttpWebRequest NameResolutionFailure исключение в .NET (с Mono в Ubuntu) - PullRequest
15 голосов
/ 25 января 2012

У меня есть программа .NET, запущенная в Ubuntu через Mono 2.10

Программа загружает веб-страницу через HttpWebRequest каждую минуту или около того, которая работает в большинстве случаев:

        String result;
        WebResponse objResponse;
        WebRequest objRequest = System.Net.HttpWebRequest.Create(url);

        using (objResponse = objRequest.GetResponse())
        {
            using (StreamReader sr =
               new StreamReader(objResponse.GetResponseStream()))
            {
                result = sr.ReadToEnd();
                // Close and clean up the StreamReader
                sr.Close();
            }
        }

Проблема в том, что через несколько дней я начинаю получать исключения:

        DateTime: 01/25/2012 08:15:41
        Type: System.Net.WebException
        Error: Error: NameResolutionFailure
        Stack:
          at System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0
          at System.Net.HttpWebRequest.GetResponse () [0x00000] in <filename unknown>:0
          at socks_server.Program.readHtmlPage (System.String url) [0x00000] in <filename  unknown>:0
          at socks_server.Program.getAccessKeysProc () [0x00000] in <filename unknown>:0

Сервер все еще в состоянии разрешить DNS, например

 wget http://www.google.com

Вернет файл без каких-либо проблем, какбудет пинговать и другие команды, которые разрешают DNS.

Однако моя программа будет продолжать генерировать это исключение, пока я не перезапущу его.После перезапуска приложения оно снова начнет работать, как и должно.

Я проверил количество открытых файлов в системе (400 ish), использование памяти (327 МБ из 4 ГБ), использование ЦП (2-3%) ивсе в порядке.

Есть идеи?

Ответы [ 5 ]

9 голосов
/ 25 января 2012

Вы можете решить эту проблему, переведя имя хоста в ip и добавив имя хоста в коллекцию Headers или свойство Host.

Если ваш URL-адрес http://example.com/uri.Разрешите хозяина самостоятельно.Предположим, это 1.2.3.4.Это будет http://1.2.3.4/uri.Теперь добавьте заголовок Host: example.com к вашему запросу.Я думаю, что это можно сделать, установив HttpWebRequest.Host свойство.

3 голосов
/ 01 октября 2015

Ну, я использую HttpClient - но это может быть похожая проблема.У меня была такая же проблема на устройстве Android (оно работало на Windows Phone) ... Но после того, как я добавил Хост в заголовок, оно заработало!

client.DefaultRequestHeaders.Host = "mydomain.com";

Вы все еще можете использовать имя в URL (вам не нужно использовать IP-адрес)

3 голосов
/ 30 января 2014

Я знаю, что это старый пост, но столкнулся с той же ошибкой, поэтому подумал, чтобы поделиться решением.

  1. Лучшее решение, которое я нашел, когда это исключение возникает, когда Wi-Fi подключен,это просто повторить мой серверный вызов с небольшим перерывом между ними.Он работает большую часть времени, в противном случае, если второй вызов завершается неудачно, я отменяю запрос.
  2. Эта ошибка также может возникать, если пользовательский Wi-Fi очень нестабилен или сигнал очень низкий.Та же самая ошибка возникает, если нет соединения с Интернетом вообще, даже если он подключен к Wi-Fi.

Это соответствует моему ответу:

Система.Net.WebException: ошибка: NameResolutionFailure при вызове служб WCF, вызывающих исключение в моно-приложении для Android

0 голосов
/ 18 апреля 2017

Я получал эту ошибку, когда запустил мобильное приложение (для Android или iOS это не имеет значения) без подключения к интернету.После восстановления соединения каждый запрос возвращает «исключение NameResolutionFailure».Мне пришлось ждать 120 секунд, чтобы запрос http снова заработал.При установке следующей строки кода в любом месте при запуске приложения ошибка наконец исчезла.

System.Net.ServicePointManager.DnsRefreshTimeout = 0;

Значение по умолчанию DnsRefreshTimeout составляет 120 секунд.

0 голосов
/ 14 марта 2013

У меня возникла такая же проблема в моем моно приложении на raspbian.Я пробовал разные решения, описанные в этой и других темах, но ни одна не работала.В конце концов мне удалось решить проблему, изменив серверы имен в /etc/resolv.conf на Google https://developers.google.com/speed/public-dns/

Мирко

...