6

I am doing task of loading the live xml file (from live url) to XmlDataDocument, but every time I am getting error:

The operation has timed out

The code is as follows, The url containing the xml feeds , I want to load it into xmlDoc.

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

Please suggest any solution.

4

4 回答 4

20

不要直接使用 XmlDataDocument 类的 Load 方法;当涉及到长时间运行的 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");
于 2012-05-02T11:18:18.463 回答
1

据我所知,没有简单的方法可以使用您使用的方法调整超时。

最简单的更改是使用 webclient 类并设置 timeout 属性。这在此处进行了描述http://w3ka.blogspot.co.uk/2009/12/how-to-fix-webclient-timeout-issue.html。然后在 webclient 上使用 downloadfile。然后在 XMLDocument 中加载保存的文件。

于 2012-05-02T11:12:41.090 回答
1

为您的网络请求设置超时:

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 分钟。

于 2012-05-02T11:23:48.087 回答
1

除了先前的答案(这应该是解决此问题的第一步)之外,尽管已经加载了响应并关闭了连接,但我仍然继续收到此异常。

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

基于破折号的回答:

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;

}
于 2017-02-16T19:55:56.340 回答