Https URLからxmlファイルをダウンロードしようとしています( 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に追加しようとしましたが、役に立ちませんでした。
その理由は、問題のサイトがTLS1.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");
}
そして、あなたは大丈夫なはずです。もちろん、System.Net.SecurityProtocolTypeはグローバル設定であり、すべてのサイトがTLS 1.2をサポートしているわけではないため、複数のTLS1.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)
}
.NET4.0。 TLS 1.2はサポートされていませんが、システムに.NET 4.5(またはそれ以降)がインストールされている場合は、アプリケーションフレームワークがTLS 1.2をサポートしていなくても、TLS1.2をオプトインできます。唯一の問題は、.NET 4.0のSecurityProtocolTypeにTLS1.2のエントリがないため、この列挙値の数値表現を使用する必要があることです。
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;