HttpClient https запрос не удается с использованием имени хоста, но работает с использованием IP-адреса - PullRequest
0 голосов
/ 16 ноября 2018

Я новичок в Интернете.Не уверен, что проблема здесь.

У меня есть машина с IIS, использующая ASP NET Core REST API по https.Я могу подтвердить, что GET работает через Google Chrome на моем компьютере, выполнив команду

Я подтвердил POSTдействие работает с почтальоном (опять же игнорируя недействительный сертификат).Все хорошо, пока я не попробую написать клиентское приложение.

У меня есть следующий код.

var ip = Dns.GetHostAddresses("test-machine");
// ip contains the correct IP 

using (var hc = new HttpClient())
{
    hc.GetAsync(@"https://test-machine/api/Example").Wait();
}

Этот код не работает.Я получаю System.AggregateException: «произошла одна или несколько ошибок».с 4 исключениями, сложенными друг на друга.

  1. HttpRequestException: при отправке запроса произошла ошибка.
  2. WebException: базовое соединение было закрыто: при отправке произошла непредвиденная ошибка.
  3. IOException: Unableдля чтения данных из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом.
  4. SocketException: существующее соединение было принудительно закрыто удаленным хостом

Если я изменилкод для использования IP вместо:

using (var hc = new HttpClient())
{
    hc.GetAsync(@"https://10.0.0.21/api/Example").Wait();
}

Тогда запрос работает , как ожидается Т.е. как и в Chrome, я получаю проблему с сертификатом:

AuthenticationException:Удаленный сертификат недействителен в соответствии с процедурой проверки.

Что я делаю не так?Dns явно в состоянии получить правильный IP, я видел это в IPAddress[], возвращаемом GetHostAddresses.Почему HttpClient не разрешает IP-адрес или разрешает IP-адрес с другой проблемой?

Я пытался

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

и

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

, но это делаетнет разницы.Использование

ServicePointManager.ServerCertificateValidationCallback

также не работает, так как никогда не достигает точки обратного вызова.Это терпит неудачу до того.

Я подозреваю, что проблема в том, что, поскольку я не знаком с чем-то из этого, я где-то пропустил что-то важное.

Следует также отметить - это консольное приложение .net 4.5.2.,Я попытался перейти на 4.6.1, и это все еще не удается.

1 Ответ

0 голосов
/ 16 ноября 2018

Я искал совершенно не в том месте. Проблема заключалась в настройке IIS.

Привязка сайта по какой-то причине была явно установлена ​​на 10.0.0.21:433. Переключение на «Все неназначенные» - похоже, сделало эту работу.

Возможно, я не в своей тарелке и могу ошибаться, но я подозреваю, что причина этого в том, что, согласно Wireshark, ответ на запрос MDNS найти IP-адрес хоста возвращал ipv6 * 1006. * адрес сервера, который, конечно, не 10.0.0.21. Опять же, я могу ошибаться.

Причина, по которой я так не уверен, заключается в том, что хром, кажется, сразу вспахал и нашел правильную вещь, когда я вставил https://test -machine / api / Example , и я не могу объяснить, почему.

...