HttpWebRequest NameResolutionFailure исключение в .NET(с Mono on Ubuntu)

У меня есть программа .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

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

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

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

Любые идеи?

Ответы

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

System.Net.WebException: Ошибка: NameResolutionFailure при вызове исключения служб WCF в приложении mono android

Ответ 4

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

Мирко

Ответ 5

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

System.Net.ServicePointManager.DnsRefreshTimeout = 0;

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