Система.Сеть.WebException: не удалось разрешить удаленное имя:

Я тестирую конечную точку, с которой у меня возникают некоторые проблемы.

Я просто использую HttpClient в цикле, который выполняет запрос каждый час.

var httpClient = new HttpClient();
var message = httpClient.GetAsync(url).Result;
Console.WriteLine(message.StatusCode);

время от времени я получаю это исключение:

Система.Сеть.Http.HttpRequestException: произошла ошибка при отправке запрос. --- >Система.Сеть.WebException: удаленное имя не удалось разрешите: 'xxx'

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

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

есть ли способ проверить, если удаленное имя не может быть решена вызвано проблемой DNS или проблемой веб-сервера из исключений? Могу ли я получить больше информации из HttpCLient или мне нужны более продвинутые диагностические инструменты?

3 ответов


это наверное вызвано проблемой подключения к локальной сети (но также возможна ошибка DNS).

это может случиться, вы мало что можете сделать.

что я бы предложил всегда обертывать этот (связанный с сетью) код в цикле с try/catch блок (Как также предлагалось здесь другие ошибаться операции). Обработайте известные исключения, подождите немного (скажем, 1000 мс) и повторите попытку (скажем, 3 раза). Только если не все раз, то вы можете выйти/сообщить об ошибке своим пользователям. Очень сырой пример, как это:

private const int NumberOfRetries = 3;
private const int DelayOnRetry = 1000;

public static HttpResponseMessage GetFromUrl(string url) {
    for (int i=1; i <= NumberOfRetries; ++i) {
        try {
            // Also consider to make this method async and await this.
            // Note that in "real code" client MUST be disposed
            return new HttpClient().GetAsync(url).Result;
        }
        catch (Exception e) {
            // DO BETTER THAN THIS! Catch what you want to handle,
            // not all exceptions worth a retry. Documentation and many
            // tests will help you to narrow a limited subset of
            // exceptions and error codes.

            // Last one, (re)throw exception and exit
            if (i == NumberOfRetries)
                throw;

            // Many network related errors will recover "automatically"
            // after some time, exact delay is pretty arbitrary and
            // should be determined with some tests. 1 second is pretty
            // "good" for local I/O operations but network issues may
            // need longer delays.
            Thread.Sleep(DelayOnRetry);
        }
    }
}

более современные и лучше реализована версия:

public static async Task<HttpResponseMessage> GetFromUrlAsync(string url) {
    using (var client = new HttpClient()) {
        for (int i=1; i <= NumberOfRetries; ++i) {
            try {
                    return await client.GetAsync(url); 
            }
            catch (Exception e) when (i < NumberOfRetries) {
                await Task.Delay(DelayOnRetry);
            }
        }
    }
}

открыть хозяева файл находится по адресу: **C:\windows\system32\drivers\etc**.

Hosts файл для чего?

В конце этого файла добавьте следующее:

YourServerIP YourDNS

пример:

198.168.1.1 maps.google.com


У меня была аналогичная проблема при попытке доступа к службе (старая служба ASMX). Вызов будет работать при доступе через IP, однако при вызове с псевдонимом я бы получил удаленное имя, которое не может быть разрешено.

добавлено следующее В конфигурацию, и это решило проблему:

<system.net>
    <defaultProxy enabled="true">
    </defaultProxy>
</system.net>