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 секундам.