替代WebClient来防止超时?

时间:2011-10-23 18:17:24

标签: c# xml httpwebrequest

我正在开发一个使用公共XML Feed进行计算的C#项目。我最初使用的是XmlDocument.Load,但是迁移到了WebClient.DownloadString所以我可以include headers in my request.我正在访问的提要通常会快速响应,但是在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的超时属性,遇到此问题的人应该使用HttpWebRequest。不幸的是,我不知道如何以一种仍然允许我使用我的标头并将结果发送到xmlDoc的方式来实现它。由于此应用程序的性质,我不关心接收数据需要多长时间;我可以处理警告用户。

这样做的最佳方法是什么?

3 个答案:

答案 0 :(得分:16)

您可以使用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,则会获得所需的超时行为。如果您需要的自定义标题对于每个请求都是相同的,那么您也可以在此处添加这些标题,并且您的调用代码仍然非常干净。

答案 1 :(得分:1)

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());

答案 2 :(得分:0)

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

bool continue;
do{
    continue = false;     
    try {
        string data = client.DownloadString(/*URL*/);
    } 
    catch (WebException e) {
        continue = true;
    }
} 
while(continue);