2017-06-12 18 views
0
var doc = XDocument.Load("https://www.predictit.org/api/marketdata/all"); 

失敗例外:的XDocument負荷甚至失敗,雖然它可以從Chrome中訪問

型「System.Net.WebException」未處理的異常發生在System.dll中

附加信息:底層連接已關閉:發送時發生意外錯誤。

即使您可以通過chrome訪問https://www.predictit.org/api/marketdata/all

該api頁面:https://predictit.freshdesk.com/support/solutions/articles/12000001878-does-predictit-make-market-data-available-via-an-api- 提到將文本附加到請求標頭,可能是線索嗎?

「要改變的返回類型任何上述的,以下內容添加到所述請求報頭的一個

接受:應用/ XML

接受:應用/ JSON」

我檢查了我的防火牆,兩個網絡都允許使用visual studio。

+0

那麼您是否已經將該標題添加到了您的請求中? – Dijkgraaf

+1

因此,使用HttpClient/WebClient/HttpWebRequest來下載XML文件,小心地匹配發送給您​​的瀏覽器發送的標頭。 [Fiddler](http://www.telerik.com/fiddler)對此非常有用。 – spender

回答

2

對於該特定錯誤,它是由TLS握手錯誤引起的。您可以通過在代碼中加入這個地方啓用相應的TLS協議解決這個問題:

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls 
    | System.Net.SecurityProtocolType.Tls11 
    | System.Net.SecurityProtocolType.Tls12; 

一旦你整理了,你會遇到的其他問題的迴應。您必須在請求上設置Accept標頭。如果您嘗試在沒有標題的情況下下載,它將默認返回JSON。瀏覽器將XML作爲標題之一,這就是爲什麼你看到XML。

你不能這樣做使用基本的XDocument.Load()重載。您必須以字符串的形式單獨下載內容,或者至少獲得具有正確標題的流並使用正確的過載。

XDocument GetSecureXDocument(string url) 
{ 
    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 
    var client = new WebClient 
    { 
     Headers = { [HttpRequestHeader.Accept] = "application/xml" } 
    }; 
    using (var stream = client.OpenRead(url)) 
     return XDocument.Load(stream); 
} 
+0

你是一個天才男人,修好了! :d –

相關問題