C # ASP.NET Core - SocketException: такой хост не известен - PullRequest
1 голос
/ 27 июня 2019

У меня возникли проблемы, которые, по-видимому, связаны с асинхронным вызовом определенного API с использованием HttpClient - странно то, что это происходит не всегда и может быть решено путем обновления страницы (иногда один раз, иногда несколько раз) ).

Я думал, что это может быть локальной проблемой, но хостинг в Azure дает те же результаты.

Необработанные детали исключения:

System.Net.Sockets.SocketException (11001): такой хост не известен в System.Net.Http.ConnectHelper.ConnectAsync (строковый хост, порт Int32, CancellationToken cancellationToken)

Я проверил:

  • На API нет ограничений
  • Передача URL-адреса запроса в браузере возвращает ожидаемый результат JSON
  • Обновление страницы иногда решает проблему

Начало ошибки: Error top

Остальное: Error bottom

Это метод, который, кажется, вызывает проблему:

public async Task<List<MoonPhase.Phasedata>> GetPhaseDataAsync(double lat, double lng, int year)
    {
        string requestUrl = "https://api.usno.navy.mil/moon/phase?year=" + year + "&coords=" + locationService.FormatCoordinates(lat, lng) + "&tz=0";

        using (var client = new HttpClient())
        {
            var content = await client.GetStringAsync(requestUrl);
            var moonPhaseObject = JsonConvert.DeserializeObject<MoonPhase.RootObject>(content, new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore
            });

            return moonPhaseObject.PhaseData;
        }
    }

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Я протестировал API, пытаясь получить доступ несколько раз в течение 15 минут (используя этот URI ).В течение минуты или двух казалось, что у него проблемы с DNS.

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

0 голосов
/ 27 июня 2019

Что?эти комментарии не совсем верны, читали ли вы документы ?Если вы используете Httpclient в сетевом ядре, вы должны использовать HttpFactory или именованный или типизированный клиент.

Использование фабрики, например,

services.AddHttpClient();

А затем

public class BasicUsageModel : PageModel
{
    private readonly IHttpClientFactory _clientFactory;

    public IEnumerable<GitHubBranch> Branches { get; private set; }

    public bool GetBranchesError { get; private set; }

    public BasicUsageModel(IHttpClientFactory clientFactory)
    {
        _clientFactory = clientFactory;
    }

    public async Task OnGet()
    {
        var request = new HttpRequestMessage(HttpMethod.Get, 
            "https://api.github.com/repos/aspnet/AspNetCore.Docs/branches");
        request.Headers.Add("Accept", "application/vnd.github.v3+json");
        request.Headers.Add("User-Agent", "HttpClientFactory-Sample");

        var client = _clientFactory.CreateClient();

        var response = await client.SendAsync(request);

        if (response.IsSuccessStatusCode)
        {
            Branches = await response.Content
                .ReadAsAsync<IEnumerable<GitHubBranch>>();
        }
        else
        {
            GetBranchesError = true;
            Branches = Array.Empty<GitHubBranch>();
        }                               
    }
}

Есть также именованные клиенты и типизированные клиенты.Попробуйте использовать их вместо вашего HttpClient напрямую, это также поможет с проблемами кеширования DNS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...