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

时间:2011-10-17 03:15:13

标签: 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时,它会引发异常:

http://i.stack.imgur.com/Xo2Ra.png (新手无法附上照片,抱歉)

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

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

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

1 个答案:

答案 0 :(得分:4)

正如我在评论中指出的那样,与来自浏览器的完整请求相比,XmlDocument.Load非常原始。当您使用像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:en-US User-Agent:Mozilla / 5.0(兼容; MSIE 9.0;   Windows NT 6.1; Trident / 5.0)Accept-Encoding:gzip,deflate   连接:Keep-Alive Host:stats.us.playstation.com Cookie:   JSESSIONID = HLygTblTG13HhXqqw80jw9Wdhw0q03dxcQLp04fD3Q5yChYvPGn6 -882698034!;   SONYCOOKIE1 = 543467712.20480.0000

现在,网络服务器的行为受到请求中指定的标头的影响。在这种情况下,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);