从 URL 加载 Xml 时出现超时错误
本文关键字:超时 错误 URL 加载 Xml | 更新日期: 2023-09-27 18:32:58
我正在执行将实时xml文件(从实时url)加载到XmlDataDocument的任务,但是每次我都收到错误:
操作已超时
代码如下,包含xml提要的url,我想将其加载到xmlDoc中。
XmlDataDocument xmlDoc = new XmlDataDocument();
xmlDoc.Load("http://www.globalgear.com.au/productfeed.xml");
请提出任何解决方案。
不要直接使用 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");
据我所知,没有简单的方法可以使用您正在使用的方法调整超时。
最简单的更改是使用 Web 客户端类并设置 timeout 属性。 此处 http://w3ka.blogspot.co.uk/2009/12/how-to-fix-webclient-timeout-issue.html 对此进行了描述。 然后在 Web 客户端上使用下载文件。 然后将保存的文件加载到 XMLDocument 中。
为 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 分钟。
除了前面的答案(这应该是解决此问题的第一步)之外,尽管已经加载了响应并关闭了连接,但我仍然继续收到此异常。
我的解决方案:如果提供的值实际上不是 XML,则 Load()
和 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;
}