Я изучаю систему приложений, которые я не создавал и для которой нет документации. Я пытаюсь сделать из него запрос api, который терпит неудачу. Ивер пробовал два разных способа: один - с помощью Microsoft HttpClient, а другой - с помощью библиотеки RestSharp. Оба работают, когда я запускаю их вне приложения. Только из CH Fiddler или тестового приложения, которое я создаю только для отладки.
Что может быть в приложении, которое останавливает звонок и почему?
Я получаю ошибку:
WebException: The request was aborted: Could not create SSL/TLS secure channel.
Метод первый:
var client = new HttpClient();
var clientResponse = client.GetStringAsync("https://xkcd.com/info.0.json").Result;
var clientJson = JsonConvert.DeserializeObject<dynamic>(clientResponse);
var imgUrl = clientJson.img;
Метод второй
var restClient = new RestClient();
restClient.BaseUrl = "https://xkcd.com";
var request = new RestRequest();
request.Resource = "/info.0.json";
var response = restClient.Execute<dynamic>(request);
// json["alt"] json["img"] eller json.img
var json = JsonConvert.DeserializeObject<dynamic>(response.Content);
var x = json.img;
Приложение работает под управлением net 4.5.
Спасибо! Я пытаюсь понять, почему это проблема в этом приложении, а не в других.
Под «другими» вы имеете в виду другие API-интерфейсы или других клиентов, которые вызывают тот же API? Если первое, это зависит от того, имеют ли эти «другие» (какими бы они ни были и где бы они ни размещались) действительный сертификат SSL, связанный с ними в конфигурации веб-сервера, или нет. В последнем случае, возможно, эти программы выполняют свои HTTP-запросы по-другому. Я ничего этого не вижу, поэтому могу только догадываться и строить предположения. Очень сложно заметить различия в вещах, которые вы не видите. Вы видели какие-нибудь из этих других приложений? Если да, то вы можете легко найти разницу ...
Я имел в виду, почему это приложение заботится о SSL, а почему другие нет. Думаю, есть конфигурация.
что именно вы имеете в виду "заботится о SSL"? Все веб-приложения, обслуживаемые по HTTPS (вместо HTTP), должны «заботиться» о SSL, как и клиенты, которые к ним подключаются. Я имею в виду это в том смысле, что должен быть действующий сертификат SSL, предоставленный веб-сервером, который используется для проверки шифрования, размещенного в запросе, которому доверяют как сервер, так и клиент. Вы много знаете о SSL / HTTPS в целом?
Нет. Каждый раз, когда я создаю новый проект в Visual Studio или запускаю код из C# Fiddler, он работает. Та же просьба.
А если это не сработает, выполняете ли вы запрос каким-либо другим способом и / или с другого компьютера? Пожалуйста, будьте ясны и конкретны. Если это так, то наиболее вероятная проблема заключается в том, что другой компьютер или другой контекст безопасности не могут прочитать или не распознают сертификат SSL API.
Вы также можете просмотреть различные предыдущие статьи по этой теме, если это поможет: google.co.uk/…
Хорошо спасибо. Все делалось с одного компьютера, с одним и тем же кодом, с одним и тем же вызовом, с одним и тем же адресом.
так каковы конкретные обстоятельства, при которых это работает, а при каких нет? Мне это не понятно. Вы упомянули, что он работает, если вы запускаете его из Visual Studio или из C# Fiddle. В каких именно обстоятельствах работает не?
Он не работает в конкретном приложении asp.net, которое я запускаю из Visual Studio. Он работает, если я создаю новое приложение asp.net в vs и запускаю код. Он работает, если я запускаю код из скрипки C#. В основном это работает везде, кроме приложения, которое я не создавал. Итак, я ищу подсказки, чтобы понять, что именно в приложении препятствует этому.
возможно, это приложение работает под другим именем? Я все еще предполагаю, что в вашем приведенном выше коде нет ничего, что могло бы дать подсказку. Я действительно не могу найти для вас разницу. Возможно, возьмите копию этого приложения, сократите ее до минимума, удалив все, что не требуется, чтобы добраться до места, где происходит этот запрос, и посмотрите, сможете ли вы избавиться от того, что вызывает проблему. И / или попробуйте прочитать об этом предмете и посмотреть, сможете ли вы получить какие-либо подсказки о том, что вам нужно искать более конкретно. И еще кое-что: какая версия .NET framework запущена?





вы также можете добавить эту строку перед выполнением любого запроса
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
Это означает (и вы можете довольно широко использовать эту ошибку в Google), что для домена, где размещен API, не установлен действующий сертификат SSL (или, возможно, есть какой-то сертификат, но машина, на которой работает ваш клиент, не доверяет ему). Проверьте, действительно ли API поддерживает HTTPS или нет, и правильный ли сертификат. Попытка получить к нему доступ через браузер может дать вам визуальное представление