XDocument加载失败,即使可以从chrome访问它

时间:2017-06-12 00:38:41

标签: c# xml

var doc = XDocument.Load("https://www.predictit.org/api/marketdata/all");

因例外而失败:

  

未处理的类型' 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- 提到在请求标题中附加文本,可能是一个线索?

  

"要更改上述任何一种的返回类型,请在请求标头中添加以下内容之一。

     

接受:application / xml

     

接受:application / json"

我检查了防火墙,两个网络都允许使用visual studio。

1 个答案:

答案 0 :(得分:2)

对于该特定错误,它是由TLS握手错误引起的。您可以通过在代码中的某处添加适当的TLS协议来修复它:

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

一旦你排序了,你就会遇到响应的其他问题。您必须在请求上设置接受标头。如果您尝试在没有标题的情况下下载,则默认情况下将返回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);
}