2011-10-17 26 views
2

我是C#的新手,但是我有一個Java和VB.NET的背景,因此跳入很容易。本週末,我開始使用C#開發一個新的迷你項目,並從互聯網上提供一個公共XML源。但是我在加載XML時遇到問題。這裏是我的代碼:C#不會加載某些XML,但可以在瀏覽器中工作

string url = ... ; 
... 
XmlDocument xmlDoc = new XmlDocument(); 
...   
try{     
    xmlDoc.Load(url); 
}catch(Exception e){ 
    Console.WriteLine(e); 
} 

當我嘗試加載XML,它拋出一個異常:

http://i.stack.imgur.com/Xo2Ra.png (新手不能附加圖片,抱歉)

我是不是在所有當我的代碼不起作用時感到驚訝。通過找出問題所在,我開始了標準的故障排除過程。我完全希望我的代碼有問題。爲了測試這個理論,我在網上找到了一個隨機的XML feed,並將它複製到我的代碼中。令我驚訝的是,它裝載得很好。現在我的懷疑轉向了目標XML。它可以在Chrome和FireFox中正常運行(加載時間爲.734秒),不需要任何憑據(向公衆開放),並且是有效的/格式良好的。

然後我想起了幾個月前我寫過的使用同一個feed的JavaScript。我解僱了,並發現它也完美地工作。

我在這裏虧本,因爲我的代碼和XML似乎都很好。有誰知道這可以解決嗎?我是否需要使用HttpWebRequest並傳遞給XmlDocument(我不知道該怎麼做)?有沒有更多的方法來解決這個問題?

+0

請發佈您的XML文件。 –

+1

XmlDoc.Load對於從Web中獲取內容相對比較原始。你處理的URL是什麼?什麼協議?它是安全的嗎? (https?)在使用XmlDocument.Load時都會出現問題 – Polity

+0

以下是直接從地址欄中輸入的URL:http://stats.us.playstation.com/warhawk/XmlFeedAction.action?start=1&end= 1 ...編輯:我只是在Chrome中加載XML非常好,並直接複製/粘貼到這個評論的URL。當我檢查鏈接時,我收到了404錯誤。 – Sonic42

回答

4

正如我在我的評論中指出的那樣,XmlDocument.Load與來自瀏覽器的完整請求相比是非常原始的。當您使用的Proxy-或Packet Tracer中諸如Fiddler,你會發現,例如IE9發出請求,包括特定的頭文件:

GET http://stats.us.playstation.com/warhawk/XmlFeedAction.action?start=1&end=1 HTTP/1.1接受:text/html的,是application/xhtml + XML ,/ Accept-Language:zh-CN User-Agent:Mozilla/5.0(compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)Accept-Encoding:gzip,deflate Connection:Keep-Alive Host:stats .us.playstation.com Cookie: JSESSIONID = HLygTblTG13HhXqqw80jw9Wdhw0q03dxcQLp04fD3Q5yChYvPGn6!-882698034; SONYCOOKIE1 = 543467712.20480.0000

現在的網絡服務器的行爲進行在請求中指定的標頭。在這種情況下,Accept和user-agent發揮作用。我可以成功地加載xml文檔中的xml內容,通過包含如下僞造標頭:

 string url = "http://stats.us.playstation.com/warhawk/XmlFeedAction.action?start=1&end=1"; 

     WebClient client = new WebClient(); 
     client.Headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1"; 
     client.Headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
     string data = client.DownloadString(url); 

     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(data); 
+0

很好的答案。所以問題不在於XML,它的服務器在獲取瀏覽器請求頭時沒有以同樣的方式響應,就像它從c#XML dom對象中獲取沒有頭的請求時那樣,對吧? –

+0

@ChrisShain - 的確,您必須在代碼中手動複製瀏覽器的行爲,或者使用更高級的/特定的庫爲您執行此操作 – Polity

+0

謝謝!我知道xmlDoc。Load()並不是這樣做的最好方式(我之前提到在OP中使用HttpWebRequest的原因),但我真的不知道還有什麼可以使用/如何使用它。你已經贏得了一個腳註,好的先生。 – Sonic42

相關問題