Подтвердить что ты не робот

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 или мне нужны более совершенные средства диагностики?

4b9b3361

Ответ 1

Вероятно, это связано с проблемой подключения к локальной сети (но также возможна ошибка 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> GetFromUrl(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);
            }
        }
    }
}