C#不会加载某种XML,但可以在浏览器中运行

我是C#的新手(呃),但我有Java和VB.NET的背景,所以跳进很容易。 本周末,我开始使用C#和来自互联网的公共XML提要创建一个新的迷你项目。 但我在加载XML时遇到问题。 这是我的代码:

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

当我尝试加载XML时,它会抛出exception:

http://sofzh.miximages.com/c%23/Xo2Ra.png (新手无法附上图片,抱歉)

当我的代码不起作用时,我并不感到惊讶。 我通过确定问题所在,开始了标准的故障排除过程。 我完全希望我的代码有问题。 为了测试这个理论,我在网上找到了一个随机的XML feed并将其复制到我的代码中。 令我惊讶的是,装得很好。 现在我的怀疑转移到了目标XML。 它适用于Chrome和FireFox(在.734秒内加载),不需要任何凭据(对公众开放),并且有效/格式良好。

然后我想起了几个月前我写过的一个使用同一个feed的JavaScript。 我解雇了它,并发现它也能完美地工作。

我在这里不知所措,因为我的代码和XML似乎都很好。 有谁知道如何解决这个问题? 我是否需要使用HttpWebRequest并传递给XmlDocument(我不知道该怎么做)? 有没有更多的方法来解决这个问题?

正如我在评论中指出的那样,与来自浏览器的完整请求相比,XmlDocument.Load非常原始。 当您使用像Fiddler这样的代理或数据包跟踪器时,您会发现例如IE9发出包含特定标头的请求:

获取http://stats.us.playstation.com/warhawk/XmlFeedAction.action?start=1&end=1 HTTP / 1.1接受:text / html,application / xhtml + xml, / Accept-Language:en-US User-Agent :Mozilla / 5.0(兼容; MSIE 9.0; Windows NT 6.1; Trident / 5.0)Accept-Encoding:gzip,deflate连接:Keep-Alive主机:stats.us.playstation.com Cookie:JSESSIONID = HLygTblTG13HhXqqw80jw9Wdhw0q03dxcQLp04fD3Q5yChYvPGn6!-882698034; SONYCOOKIE1 = 543467712.20480.0000

现在,Web服务器的行为受到请求中指定的标头的影响。 在这种情况下,Accept和user-agent扮演一个角色。 我可以通过包含一些如下所示的假标题成功地在XmlDocument中加载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);