2016-09-03 58 views
2

試圖從HTTPS URL下載XML文件(https://nvd.nist.gov/download/nvd-rss.xmlWebClient的錯誤從https下載文件時,URL

此URL是通過瀏覽器公開訪問。

在控制檯項目中使用C#Webclient。

但越來越異常,如下

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

$ {例外「的基礎連接已關閉:上一個發送發生意外的錯誤」} System.Net.WebException

嘗試添加的所有屬性,如SSL等system.Net,但沒有幫助。

回答

6

的原因是網站的問題只支持TLS 1.2。在.NET中,默認值爲System.Net.ServicePointManager.SecurityProtocolSsl | 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; 
+0

感謝您的解答和解釋。這工作完美。 –

+0

好!請標記爲答案以幫助其他有類似問題的人更快地找到答案。 – Evk

0

嘗試這樣的:

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) 

} 
+0

謝謝你的答覆。試過這個,但是這並沒有觸發任何請求或收到任何迴應。在小提琴手也驗證。 var response = await client.GetAsync(「https://nvd.nist.gov/download/nvd-rss.xml」); –