Попытка загрузить 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, но не помогло.
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;
Попробуйте с этим:
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)
}
.NET 4.0. TLS 1.2 не поддерживается, но если в вашей системе установлен .NET 4.5 (или выше), вы все равно можете выбрать TLS 1.2, даже если ваша платформа приложения не поддерживает его. Единственная проблема заключается в том, что SecurityProtocolType в .NET 4.0 не имеет записи для TLS1.2, поэтому нам нужно будет использовать числовое представление этого значения перечисления:
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.