Ошибка в WebRequest.GetResponse() и протокол HTTPS

Сегодня получится краткий обзор об исключении, которое возникает при попытке получить содержимое страницы с использованием метода GetResponse() класса WebRequest. При этом страницы сайтов, получаемые через незащищенное соединение (протокол HTTP), отрабатывают без каких-либо ошибок. А вот, если вы захотите получить страницу через защищенное соединение (протокол HTTPS), то могут возникнуть некоторые трудности.

Внимание! Не для всех страниц с протоколом HTTPS возникает исключительная ситуация. Например, исключение может быть при использовании сайтом бесплатного сертификата Let’s Encrypt, использующего TLS шифрование.

Самые распространенные исключения, которые возникают:

System.Net.WebException: "Базовое соединение закрыто: Непредвиденная ошибка при передаче.

"IOException: Не удается прочитать данные из транспортного соединения: Удаленный хост принудительно разорвал существующее подключение.

SocketException: Удаленный хост принудительно разорвал существующее подключение

Ниже приведу пример кода для получения содержимого web-страницы (рабочий вариант):

using System;
using System.IO;
using System.Net;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string url = "https://www.petrolplus.ru";

            // Без этой строки возможно выскакивание исключения!
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            WebRequest request = WebRequest.Create(url);
            request.Credentials = CredentialCache.DefaultCredentials;

            WebResponse response = request.GetResponse();  
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            Stream dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            string responseFromServer = reader.ReadToEnd();
            Console.WriteLine(responseFromServer);
            reader.Close();
            response.Close();

            Console.ReadKey();
        }
    }
}

Как видно из примера кода строка ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 гарантирует, что не будет проблем с сертификатом. Здесь мы присваиваем протокол TLS 1.2.

Спасибо всем за внимание.

 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: