Форум » » SIMPL# HttpClient » Ответить

SIMPL# HttpClient

Viacheslav Alekseev: А кто-нибудь имел дело с HttpClient (HttpsClient) на SIMPL#? Написал простейший класс для отправки запросов, вот такой: [pre2]public class HTTPClient { private HttpClient client1; private HttpsClient client2; public HTTPClient() { client1 = new HttpClient(); client2 = new HttpsClient(); client2.Verbose = true; client2.HostVerification = false; client2.PeerVerification = false; } public string Get(string Url) { if (Url.StartsWith("https://")) { var response = client2.Get(Url); return response.Substring(0, 100); } else if (Url.StartsWith("http://")) { var response = client1.Get(Url); return response.Substring(0, 100); } else return "Unknown Protocol in URL"; } }[/pre2] В итоге оно почти работает, но: Большинство запросов по адресам http://, которые обрабатываются через HttpClient, вызывают исключение с ошибкой "No such host is known". Пробовал разные - в зоне ru, в зоне com. С www и без. С префиксом http:// и без него. Нормально сработал только один - http://google.com. Все остальные с ошибкой. Однако, эти же сайты, если поменять http на https, прекрасно резолвятся классом HttpsClient и выдают какой-нибудь ответ. Излишним будет говорить, что ДНС в процессоре настроен и если сделать ping этих сайтов в консоли процессора - они все резолвятся и пингуются. Получается, что какой-то странный косяк исключительно в HttpClient.... П.С. пробовал переписать простой вызов client.Get() на вот такой: [pre2]var request = new HttpClientRequest(); request.Url.Parse(Url); var response = client1.Dispatch(request); [/pre2] Все то же самое.

Ответов - 10

olegny: HttpClient и HttpsClient это две абсолютно разные имлементации, но с похожим API (потому, что сначала был http, а потом понадобился https :)) Я, как бы, не удивлен, что http лажает, ибо он давно уже никому особо не интересен как небезопасный, но починить надо конечно... Тот факт, что https работает нормально, говорит о том, что в вашей системе с DSN все хорошо, а откуда http "знает" о google и почему только о нем - вопрос интересный! )) Надо будет завтра самому попробовать... Отпишусь! По коду, второй вариант ничем не отличается от первого, т.к. внутри HttpClient делает по-сути то же самое.

olegny: Однако пока не удалось ничего воспроизвести из написанного. Все сайты, что я пробовал, разрешаются замечательно, так же как и google.com

Viacheslav Alekseev: Чудеса. Может у меня что-то с прошивкой. или версией SIMPL#... Однако, на сайте одна и та же версия лежит уже давно. Проверю еще на другом процессоре.


olegny: Ну, кстати, я не из S# проверял, а напрямую из C#. Однако не вижу как это могло повлиять... Какие у вас версии фирмвари и include4 кстати?

Viacheslav Alekseev: Коллеги, кому не лень, проведите тест у себя. Прикладываю тестовую программу, которую можно залить в процессор. Там все исходники, включая исходник SIMPL#-модуля, если кому-то захочется его пересобрать. Но для начала лучше запустить скомпиленную мной версию. Прога простейшая - в сигнал GetURL1 записываем URL. Далее дергаем сигнал Get1 и смотрим что получилось. Посмотрите на скриншоты - на http-запросы только google заресолвился. Остальные не смогли. То же самое через https - ресолвится без проблем. Не пойму, может у меня версия SIMPL# какая-то кривая. Пробовал на двух разных процессорах с разными прошивками (1.600 и 1.504) - поведение одинаковое. АРХИВ: https://yadi.sk/d/DLUKW7NrWMoMxA HTTP: HTTPS

Viacheslav Alekseev: olegny пишет: Какие у вас версии фирмвари и include4 кстати? Фирмвари 1.504 и 1.600 (написал выше). А где посмотреть версию include4?

olegny: Да, интересная игрушка! )) У меня тоже не работает на том же контроллере, где я проверял c чистым C# выше. Сообщу как найду что-нить...

olegny: Все ясно. Действительно лажа в HTTP клинте при переадресации. Все эти сайты делают redirect на https:// и только google меняет при этом имя хоста на www.goole.com что добавляет 4 лишних симола, которые съедают мусор в конце во всех остальных случаях: "crestron.comhttps" вот, что клиент пытается резолвить, например. С другой стороны, http клиент не приспособлен для обработки https запросов так, что данный клиент просто должен бы "послать" с коректным исключением. Это они поправят я думаю, но не критично. Можно это обойти если обрабатывать redirect самому (AllowAutoRedirect = false).

Viacheslav Alekseev: olegny пишет: У меня тоже не работает на том же контроллере, где я проверял c чистым C# выше. Спасибо за расследование. Теперь понятно. С AllowAutoRedirect = false стало лучше. А что за "чистый C#" - это тот что SimplSharp Pro, или еще более "чистый", без крестроновских обёрток? :) А как на нем программировать под Crestron?

olegny: Да, это обычный C# вне "песочницы", но официально пользователям не доступен. Впрочем и смысла в нем практического мало, ибо все равно нужна объектная модель S#/Pro. "Песочница" она не только чтобы не пущать, но и для удобства тоже... ;) Говорят, что когда-нибудь в 4-й серии песочницу отменят и тогда будет доступна вся мощь .NET



полная версия страницы