Попытка загрузить XML-файл с https-URL (https://nvd.nist.gov/download/ nvd-rss.xml)

Этот URL-адрес доступен через браузер.

Использование C # Webclient с консольным проектом.

Но получение исключения, как показано ниже

    using (WebClient client = new WebClient())
    {
            System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3;
            client.DownloadFile(uri, @"c:\test\nvd-rss.xml");
    }

$ exception {"Базовое соединение было закрыто: при отправке произошла непредвиденная ошибка."} System.Net.WebException

Пытался добавить все свойства, такие как SSL и т. Д., В system.Net, но не помогло.

8
Pradeep H 3 Сен 2016 в 16:53

3 ответа

Лучший ответ

Причина в том, что данный сайт поддерживает только TLS 1.2. В .NET значение по умолчанию для System.Net.ServicePointManager.SecurityProtocol - Ssl | Tls, что означает, что клиент .NET по умолчанию не поддерживает Tls 1.2 (он не перечисляет этот протокол в списке поддерживаемых протоколов во время согласования SSL). По крайней мере, так обстоит дело со многими версиями .NET Framework, не уверен, что для всех. Но .NET действительно поддерживает TLS 1.2, и для его включения вам нужно просто сделать:

string uri = "https://nvd.nist.gov/download/nvd-rss.xml";
using (WebClient client = new WebClient())
{
     System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
     client.DownloadFile(uri, @"c:\test\nvd-rss.xml");
}

И все должно быть в порядке. Конечно, лучше поддерживать более одного протокола TLS 1.2, потому что System.Net.SecurityProtocolType - это глобальный параметр, и не все сайты поддерживают TLS 1.2:

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;
22
Evk 3 Сен 2016 в 14:36

Попробуйте с этим:

using (HttpClient client = new HttpClient())
{
      var response = await client.GetAsync("https://nvd.nist.gov/download/nvd-rss.xml");

      string xml = await response.Content.ReadAsStringAsync();
      //or as byte array if needed
      var xmlByteArray = await response.Content.ReadAsByteArrayAsync();
      //or as stream
      var xmlStream = await  response.Content.ReadAsStreamAsync();

      //write to file
       File.WriteAllBytes(@"c:\temp\test.xml", xmlByteArray)

 }
1
Robert 3 Сен 2016 в 14:07

.NET 4.0. TLS 1.2 не поддерживается, но если в вашей системе установлен .NET 4.5 (или выше), вы все равно можете выбрать TLS 1.2, даже если ваша платформа приложения не поддерживает его. Единственная проблема заключается в том, что SecurityProtocolType в .NET 4.0 не имеет записи для TLS1.2, поэтому нам нужно будет использовать числовое представление этого значения перечисления:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
3
ah pourhaji 4 Апр 2020 в 07:57