C# 从URL加载Xml时出现超时错误

C# 从URL加载Xml时出现超时错误,c#,asp.net,xml,C#,Asp.net,Xml,我正在执行将live xml文件(从live url)加载到XmlDataDocument的任务,但每次都出现错误: 操作已超时 代码如下,包含xml提要的url,我想将其加载到xmlDoc中 XmlDataDocument xmlDoc = new XmlDataDocument(); xmlDoc.Load("http://www.globalgear.com.au/productfeed.xml"); 请提出任何解决方案。据我所知,用您使用的方法调整超时时间并不容易 最简单的更改是使用w

我正在执行将live xml文件(从live url)加载到XmlDataDocument的任务,但每次都出现错误:

操作已超时

代码如下,包含xml提要的url,我想将其加载到xmlDoc中

XmlDataDocument xmlDoc = new XmlDataDocument();
xmlDoc.Load("http://www.globalgear.com.au/productfeed.xml");

请提出任何解决方案。

据我所知,用您使用的方法调整超时时间并不容易


最简单的更改是使用webclient类并设置timeout属性。这里描述了这一点。然后在webclient上使用downloadfile。然后将保存的文件加载到XMLDocument中。

不要直接使用XmlDataDocument类的加载方法;当涉及到长时间运行的HTTP请求时,您几乎没有办法影响行为

相反,使用HttpWebRequest和HttpWebResponse类为您完成工作,然后将后续响应加载到文档中

例如:

    HttpWebRequest rq = WebRequest.Create("http://www.globalgear.com.au/productfeed.xml") as HttpWebRequest;
    //60 Second Timeout
    rq.Timeout = 60000;
    //Also note you can set the Proxy property here if required; sometimes it is, especially if you are behind a firewall - rq.Proxy = new WebProxy("proxy_address");
    HttpWebResponse response = rq.GetResponse() as HttpWebResponse;


    XmlTextReader reader = new XmlTextReader(response.GetResponseStream());

    XmlDocument doc = new XmlDocument();
    doc.Load(reader);
我已经在本地应用程序实例中测试了这段代码,XmlDocument中填充了来自URL的数据

在上面的示例中,您还可以用XmlDataDocument替换XmlDocument——我更喜欢使用XmlDocument,因为它(尚未)标记为过时

我已经为您将其包装在一个函数中:

public XmlDocument GetDataFromUrl(string url)
{
    XmlDocument urlData = new XmlDocument();
    HttpWebRequest rq = (HttpWebRequest)WebRequest.Create(url);

    rq.Timeout = 60000;

    HttpWebResponse response = rq.GetResponse() as HttpWebResponse;

    using (Stream responseStream = response.GetResponseStream())
    {
        XmlTextReader reader = new XmlTextReader(responseStream);
        urlData.Load(reader);
    }

    return urlData;

}
只需使用以下命令调用:

XmlDocument document = GetDataFromUrl("http://www.globalgear.com.au/productfeed.xml");

为web请求设置超时:

using System;
using System.Net;
using System.Xml;

namespace Shelver
{
    class Program
    {
        static void Main(string[] args)
        {
            WebRequest requ = WebRequest.Create("http://www.globalgear.com.au/productfeed.xml");
            requ.Timeout = 10 * 60 * 1000; // 10 minutes timeout and not 100s as the default.
            var resp = requ.GetResponse();

            Console.WriteLine("Will download {0:N0}bytes", resp.ContentLength);
            var stream = resp.GetResponseStream();
            XmlDocument doc = new XmlDocument();
            doc.Load(stream);

        }
    }
}

本例将其设置为10分钟

除了前面的答案(这应该是解决这个问题的第一步)之外,尽管已经加载了响应并关闭了连接,我还是继续得到这个异常

我的解决方案是:
Load()
LoadXml()
方法将在提供的值实际上不是XML时抛出自己的超时异常。在我们的例子中,检查以验证响应内容是XML工作的(这将要求从中获取响应的主机实际设置内容类型)

基于dash的回答:

public XmlDocument GetDataFromUrl(string url)
{
    XmlDocument urlData = new XmlDocument();
    HttpWebRequest rq = (HttpWebRequest)WebRequest.Create(url);

    rq.Timeout = 60000;

    HttpWebResponse response = rq.GetResponse() as HttpWebResponse;

    // New check added to dash's answer.
    if (response.ContentType.Contains("text/xml")
    {
        using (Stream responseStream = response.GetResponseStream())
        {
            XmlTextReader reader = new XmlTextReader(responseStream);
            urlData.Load(reader);
        }
    }

    return urlData;

}

但我想阅读实时URL提要。谢谢你的回复。这就是我使用此方法的原因。您好,谢谢你的回复,我使用了与你上面提到的相同的方法,但我仍然收到相同的错误。我将超时设置为60000。你能从浏览器访问URL吗?这需要很长时间吗?如果是,则增加超时时间。你知道你有代理人吗?如果您有代理,您可能需要在代码中设置。是的,我访问了url,但在页面上显示内容不会花费太长时间。我也一样。上面的代码适合我,这就是为什么我怀疑您可能有代理问题或其他问题。你知道你是否支持代理吗?此外,为了防止缓存在某个地方,请尝试将querystring参数附加到URL的老技巧—例如,不,我们不使用任何代理,xml文件总共有1449条记录。我把它也放在代码中,我接受你的代码。我是否增加超时bcoz文件有太多数据?感谢您的回复,我设置了与上面示例中的u设置相同的时间,但仍然显示相同的错误。您从服务器获得了任何信息吗?如果首先添加string=sReader.ReadLine(),会发生什么;然后打印出来?在浏览器中打开文件时,您是否收到任何信息?当我在浏览器中打开此url时,显示xml文件的内容不会花费太多时间。您是否让console应用程序运行?它是否打印要下载的字节数,或者之前是否失败?