Запрос был прерван: не удалось создать защищенный канал SSL/TLS c# Webrequest

Я пытаюсь вызвать службу, используя приведенный ниже набор кода в С#. я использую .NET Framework 4.6.2. и всякий раз, когда я достигаю кода (HttpWebResponse)myHttpWebRequest.GetResponse(), он генерирует исключение. Запрос был прерван: не удалось создать безопасный канал SSL/TLS. Я пробовал много решений, указанных в переполнении стека. но ни один из них мне не помог. Я борюсь с этим с прошлой недели, а затем, наконец, публикую здесь. пожалуйста, любая помощь будет оценена. Я даже добавил сертифицированные в местные магазины, но все равно бесполезно. ниже мой код.

ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Uri myUri = new Uri("https://CallingUrl");
WebRequest myWebRequest = HttpWebRequest.Create(myUri);
HttpWebRequest myHttpWebRequest = (HttpWebRequest)myWebRequest;
string svcCredentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("User:Pwd"));
myHttpWebRequest.Headers.Add("Authorization", "Basic " + svcCredentials);
myHttpWebRequest.PreAuthenticate = true;
myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
myHttpWebRequest.Method = "POST"
HttpWebResponse httpResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();

person Vijay H    schedule 26.08.2020    source источник
comment
Можете ли вы заставить это работать в почтальоне? У вас есть документация от автора для службы? Кроме того, почему вы используете веб-запрос, а не HttpClient, есть ли конкретный вариант использования?   -  person TheGeneral    schedule 26.08.2020
comment
Я проверил это в инструменте почтальона, и я получаю правильный ответ. и я также пробовал с HttpClient, тогда я столкнулся с той же проблемой @MichaelRandall   -  person Vijay H    schedule 26.08.2020
comment
Вы пытались изменить ServicePointManager.SecurityProtocol   -  person TheGeneral    schedule 26.08.2020
comment
Да, я пробовал SS3, Tls, Tls11, Tls12, но все равно бесполезно @MichaelRandall   -  person Vijay H    schedule 26.08.2020
comment
Это может быть проблема с запросом HttpWebRequest, вы можете попробовать добавить ссылку на службу для вызова службы вместо прямого создания http-запроса.   -  person Ding Peng    schedule 28.08.2020


Ответы (1)


Вышеприведенный код отлично подходит. но эта проблема была вызвана другой причиной.

После того, как вы много покопались, наконец, нашли решение и подумали, что оно поможет другим, столкнувшимся с той же проблемой, поэтому опубликуйте этот ответ.

Причина:

По умолчанию ограничение в реализации Schannel составляет 32768 байт. Как только он достигнет максимального предела, он вернет вышеуказанную ошибку во время рукопожатия между Сервисом.

Решение:

  1. Увеличьте MessageLimitClient со значения по умолчанию 0x8000 до максимального значения 0xf000 с помощью раздела реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel\Messaging.

  2. Создайте ключ Messaging, если он отсутствует.

  3. Затем создайте новое DWORD, назовите его как «MessageLimitClient» и установите значение Valuedata как «f000» (шестнадцатеричное).

  4. После изменения этого значения перезапустите сервер, чтобы новое значение вступило в силу.

введите здесь описание изображения

person Vijay H    schedule 31.08.2020
comment
К сожалению, в моем случае это решение не помогло (по крайней мере, без перезагрузки). Но есть проблема в описании. 1-й: у меня не было ключа Messaging в реестре. 2-й: В текстовом описании написано MaxLimitClient, а на картинке MessageLimitClient. - person Julo; 07.09.2020
comment
отредактировано. если у вас нет Messaging, то вам необходимо его создать. я упомянул это - person Vijay H; 09.09.2020
comment
Я добавил ключ (и старый, и новый) и, к сожалению, это не помогло мне исправить ошибку. Сейчас я работаю над решением, использующим Python в качестве считывателя HTTP-запросов. - person Julo; 09.09.2020
comment
есть много причин, которые вызывают ту же проблему. в вашем случае причиной может быть что-то еще, @Julo - person Vijay H; 09.09.2020