c#不能加载特定的XML,但可以在浏览器中工作

本文关键字:但可以 浏览器 工作 XML 加载 不能 | 更新日期: 2023-09-27 18:11:30

我是c#的新手,但我有Java和VB的背景。NET,所以跳进去很容易。这个周末,我用c#和一个来自互联网的公共XML feed开始了一个新的小项目。但我在加载XML时遇到了问题。下面是我的代码:

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

当我尝试加载XML时,它抛出一个异常:

https://i.stack.imgur.com/Xo2Ra.png(新手不能附上图片,抱歉)

当我的代码不能工作时,我一点也不惊讶。我通过找出问题所在开始了标准的故障排除过程。我完全预料到我的代码是错误的。为了测试这个理论,我在网上找到了一个随机的XML提要,并将其复制到我的代码中。令我惊讶的是,它装得很好。现在我的怀疑转移到了目标XML上。它在Chrome和FireFox中运行良好(加载时间为0.734秒),不需要任何凭据(向公众开放),并且有效/格式良好。

然后我想起了几个月前我写的一个JavaScript,它使用了同样的提要。我启动了它,发现它也工作得很好。

我在这里不知所措,因为我的代码和XML似乎都很好。有人知道这是怎么解决的吗?我是否需要使用HttpWebRequest并传递到XmlDocument(我不知道如何做到这一点)?还有其他方法来解决这个问题吗?

c#不能加载特定的XML,但可以在浏览器中工作

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

得到http://stats.us.playstation.com/warhawk/XmlFeedAction.action?start=1&end=1接受:text/html, application/xhtml+xml, /接受语言: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.comJSESSIONID = HLygTblTG13HhXqqw80jw9Wdhw0q03dxcQLp04fD3Q5yChYvPGn6 ! -882698034;SONYCOOKIE1 = 543467712.20480.0000

现在web服务器的行为服从于请求中指定的报头。在这种情况下,Accept和用户代理发挥作用。我可以成功地在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);
相关文章: