Ребят, очередная лепёшка дерьма засада из стана мелкомягких:
Есть HttpClient (который типа новый путь взамен старого WebClient). Есть простейший сайт валют: www.x-rates.com (требующий https).
Пишем простейший код получения html странички:
var cli = new HttpClient();
var html = await cli.GetStringAsync(@"https://www.x-rates.com/");
Если сканпелять проект под .NET 4.6.1 — всё отлично, код работает, получили страничку.
Меняем на .NET 4.7.1+ — всё, кранты — не работает! Это как вообще так?? Пишет ошибку "удалённый сервер закрыл соединение".
Очевидно, танцоры-улучшатели уже наконопатили чего-то там внутрях, что совместимость нарушена, а то и вообще новый код получился нерабочий.
Я плюнул на их "косоногие хэлперы" и вот во время низкоуровневых игр с SslStream читаю доку на SslStream.AuthenticateAsClient():
Starting with .NET Framework 4.7, this method authenticates using None, which allows the operating system to choose the best protocol to use, and to block protocols that are not secure.
И вот тут меня осенило, откуда руки из *опы растут! Скорее всего HttpClient юзает низлежащий SslStream, где и получает отлуп.
Не кажется ли программирующей публике, что мелкомягкие опять охренели в край и своей "заботой о защите" ломают чужой код и отрезают программиста от половины тырнета? Причём даже без возможности специально указать HttpClient'у "хватит выёживаться своей диктатурой и дай нормально забрать страницу по чуть менее надёжному протоколу".
Кто-нибудь сталкивался с этими костылями и смог их обойти?
Рекомендую всегда настраивать все что можно в ServicePointManager и протоколы тоже, ведь там есть очевидные гонки. Конфигр для слабаков. Мсднится это вроде легко. Может заблокировали старые насовсем... Х.з. сомневаюсь.
Ну и было бы очень хорошо, если бы Ваш, тон соответствовал проблеме: а именно не стоит выеденного яйца. И взывать о вселенском айайа тут не стоит. Здесь технический форум — хочешь достойный ответь, потрудись совладать с языком.
Здравствуйте, Kolesiki, Вы писали:
K>И вот тут меня осенило, откуда руки из *опы растут! Скорее всего HttpClient юзает низлежащий SslStream, где и получает отлуп.
Это типично для SSL, и при создании HttpClient есть возможность повесить специальный хэндлер для разбирательств с SSL и прочим.
Здравствуйте, Kolesiki, Вы писали:
K>Ребят, очередная лепёшка дерьма засада из стана мелкомягких:
Ребят, очередной истерический [s]высер[s] мессадж от из стана Kolesiki:
Есть HttpClient, создаем консольное приложение под .NET 4.7.2 (который типа новый путь взамен старого 4.6.1) и пишем
namespace ConsoleApp1
{
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var cli = new HttpClient();
var html = await cli.GetStringAsync(@"https://www.x-rates.com/");
Console.WriteLine(html);
Console.ReadKey(true);
}
}
}
Если сканпелять это — всё отлично, код работает, получили страничку.
Смотрим на сообщение Kolesiki и понимаем что у него руки из *опы растут!
Не кажется ли программирующей публике, что Kolesiki опять охренели в край и своей истерикой о Микрософт отвлекает остальных программистов от реальных дел и отдыха?
Здравствуйте, Doc, Вы писали:
Doc>Здравствуйте, Kolesiki, Вы писали:
K>>Ребят, очередная лепёшка дерьма засада из стана мелкомягких:
Doc>Ребят, очередной истерический [s]высер[s] мессадж от из стана Kolesiki: Doc>Есть HttpClient, создаем консольное приложение под .NET 4.7.2 (который типа новый путь взамен старого 4.6.1) и пишем Doc>
Doc>namespace ConsoleApp1
Doc>{
Doc> using System;
Doc> using System.Net.Http;
Doc> using System.Threading.Tasks;
Doc> class Program
Doc> {
Doc> static async Task Main(string[] args)
Doc> {
Doc> var cli = new HttpClient();
Doc> var html = await cli.GetStringAsync(@"https://www.x-rates.com/");
Doc> Console.WriteLine(html);
Doc> Console.ReadKey(true);
Doc> }
Doc> }
Doc>}
Doc>
Проверил ваш пример
на 4.6.2 — работает
на 4.7.1+ — нет
Здравствуйте, Doc, Вы писали:
Doc>Здравствуйте, alexander_r, Вы писали:
_>>на 4.6.2 — работает _>>на 4.7.1+ — нет
Doc>Я запускал на 4.7.2. Сейчас пересобрал под 4.7.1. Тоже ок. Doc>Как-то так
Здравствуйте, Jack128, Вы писали:
J>Вы не фрейвоки, а оси сравните.
Хороший совет, но уж чересчур косвенный! Конечно же работаю в православной Win7x64! Но с другой стороны, кого это должно парить-то? Это операционная система, её дело — самые низкоуровневые фичи обеспечивать. Более того — фрэймворк как раз и должен нивелировать различия систем. А у мелкомягкой индусни похоже наоборот — тащат всех за хвост и гриву в своё стойло "десятников", недообеспечивая функционал семёрки. Более того — почему-то Опера вообще не ругается на сайт — на каком протоколе смогла законнектиться — на том и забрала страницу. Задача клиента — не выёживаться, а обеспечить доставку информации. Более того — и "информация"-то — так себе, прости господи — курсы валют! Ни паролей, ни эккаунтов.
Здравствуйте, Mystic Artifact, Вы писали:
MA>Здравствуйте, Kolesiki, Вы писали:
MA> Рекомендую всегда настраивать все что можно в ServicePointManager и протоколы тоже
Кто б знал... А главное — мелкомягкие почему-то вообще не чешутся объяснениями, что они напортачили и как заставить старый код работать. Ведь это явный breaking changes, который обязан описываться во всех подробностях!
MA> Ну и было бы очень хорошо, если бы Ваш, тон соответствовал проблеме
В приличном обществе грузчиков вам бы порекомендовали учить жену щи варить. На своём же месте я имею полное право возмущаться тупорылым поведением индусомакак, ломающих мой код. По-моему, человеческие форумы (типа RSDN, SQL.ru и т.п.) для этого и существуют — обсуждать проблемы с соотв. эмоциональной составляющей. А сухую документацию я и в MSDN прочту.
Спасибо за наводку с ServicePointManager — ею и стоило ограничиться. Ну и так, для полноты картины — Я ПРО***АЛ ЧЕТЫРЕ ЧАСА своего времени на ковыряние в SSL, проб разных классов и т.п. вплоть до ручной организации SSL-соединения. Я думаю, я имею право повозмущаться беспардонным поведением идиотов — за эти же 4 часа у меня б была уже написана полная программа.
Итак, для тех счастливчиков, что уже получили граблями от breaking changes в .NET 4.7.1, лекарство — пластырь! Пишете эту строчку в любом месте старт-кода и вуаля — работает!