System.Net.WebException: Удаленное имя не может быть разрешено:

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

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

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

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

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

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

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

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

c#,.net,system.net.webexception,

26

Ответов: 3


30 ов принято

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

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

То, что я предложил бы всегда переносить этот (связанный с сетью) код в цикле с помощью try/ catchblock (как это также предлагается здесь для других ошибочных операций). Обращайтесь с известными исключениями, подождите немного (скажем, 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);
            }
        }
    }
}

2

Откройте файл hosts, расположенный по адресу: ** C: windows system32 drivers etc **.

Файл хостов для чего?

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

YourServerIP YourDNS

Пример:

198.168.1.1 maps.google.com


0

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

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

<system.net>
    <defaultProxy enabled="true">
    </defaultProxy>
</system.net>
C # ,. сеть, System.Net.WebException,
Похожие вопросы