C# 替代WebClient以防止超时?

C# 替代WebClient以防止超时?,c#,xml,httpwebrequest,C#,Xml,Httpwebrequest,我正在从事一个C#项目,该项目使用公共XML提要进行计算。我最初使用XmlDocument.Load,但迁移到WebClient.DownloadString,这样我就可以知道我正在访问的提要通常会快速响应,但它在WebClient对象的超时时间内时不时地无法响应,我得到一个异常。这是我的密码: XmlDocument xmlDoc = new XmlDocument(); Webclient client = new WebClient(); client.Headers["User-Age

我正在从事一个C#项目,该项目使用公共XML提要进行计算。我最初使用XmlDocument.Load,但迁移到WebClient.DownloadString,这样我就可以知道我正在访问的提要通常会快速响应,但它在WebClient对象的超时时间内时不时地无法响应,我得到一个异常。这是我的密码:

XmlDocument xmlDoc = new XmlDocument();

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*/);

xmlDoc.LoadXml(data);
我已经读到,您不能更改WebClient的timeout属性,有此问题的人应该改用HttpWebRequest。不幸的是,我不知道如何以一种仍然允许我使用头并将结果发送到xmlDoc的方式来实现它。由于此应用程序的性质,我不关心接收数据需要多长时间;我可以处理提醒用户的问题


做这件事最好的方法是什么

您可以捕获异常,然后重新发出请求。您可能希望在这里加入一些其他逻辑,以便在一定次数的失败尝试后中止

XmlDocument xmlDoc = new XmlDocument();

HttpWebRequest request = new (HttpWebRequest)WebRequest.Create(/*URL*/);
request.Headers = new WebHeaderCollection();
// fill in request.Headers...

// The response is presented as a stream. Wrap it in a StreamReader that
// xmlDoc.LoadXml can accept.
xmlDoc.LoadXml(new StreamReader(request.GetResponse().GetResponseStream());
bool continue;
do{
    continue = false;     
    try {
        string data = client.DownloadString(/*URL*/);
    } 
    catch (WebException e) {
        continue = true;
    }
} 
while(continue);

您可以为此使用
WebClient
派生类,该类只需为每次提取添加所需的超时:

public class TimeoutWebClient : WebClient
{
    protected override WebRequest GetWebRequest(Uri address)
    {
        HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
        request.Timeout = 60000; //1 minute timeout
        return request;
    }
}

如果现在使用
TimeoutWebClient
而不是
WebClient
,则可以获得所需的超时行为。如果每个请求所需的自定义标头相同,你也可以在这里添加它们,并且你的调用代码保持非常干净。

你对
HttpWebRequest
有什么问题?@MystereMan如果服务器速度慢,每次响应时间都是10分钟,那会怎么样?如果请求成功,这不是会产生一个无限循环吗?@L.B-他说它通常响应速度很快,只是偶尔会超时。这可能是因为服务器中止并永远无法完成请求,所以长时间的超时将一直等待直到超时为止。@Sonic42-捕获良好,已修复。@MystereMan但您的代码没有显示如何设置短超时,以便快速完成任何新的尝试。请确认,我可以将您的代码粘贴到任何地方,然后使用与WebClient完全相同的TimeoutWebClient?始终值得补充的是,WebClient是可识别的,因此TimeoutWebClient也是可识别的;使用on:)获取您的