版权保护声明:本文未经许可,禁止任何形式转载,违者必究。
问题描述
在.NET应用程序开发中,很多时候需要使用程序向远程的API发起HTTP请求。而.NET的程序集内置了一个可以发起HTTP请求的类:WebClient
,WebClient
实现了下载/上传的一些方法,如:DownloadData
,DownloadFile
,DownloadString
,OpenRead
,OpenWrite
,UploadData
,UploadFile
,UploadString
,UploadValues
等等。这些方法可以方便我们在.NET开发中更方便地实现字符串、或者文件,或者数据流的上传或者下载功能。
但如果远程服务速度比较慢,遇到请求超时的情况,WebClient是不能直接设置请求超时时间的(默认的超时时长为100秒),也就是说直接使用WebClient的情况下,如果远程服务在100秒内还未响应完成,则会超时。
那么,如何设置WebClient的超时时长呢?
方案一
重写WebClient的GetWebRequest()
方法,这样可以设置超时时长,如下:
private class MyWebClient : WebClient
{
protected override WebRequest GetWebRequest(Uri uri)
{
WebRequest w = base.GetWebRequest(uri);
w.Timeout = 20 * 60 * 1000;
return w;
}
}
使用WebClient的地方换成MyWebClient,如:
using(var wc = new MyWebClient())
{
//你的HTTP请求代码逻辑
}
方案二
重写WebClient的GetWebRequest
,同时新增设置超时时长的公开属性,如下:
public class WebClient : System.Net.WebClient
{
public int Timeout { get; set; }
protected override WebRequest GetWebRequest(Uri uri)
{
WebRequest lWebRequest = base.GetWebRequest(uri);
lWebRequest.Timeout = Timeout;
((HttpWebRequest)lWebRequest).ReadWriteTimeout = Timeout;
return lWebRequest;
}
}
调用示例代码:
using (var lWebClient = new WebClient())
{
lWebClient.Timeout = 600 * 60 * 1000;
return lWebClient.DownloadString(aURL);
}
方案三
不使用WebClient,而使用HttpWebRequest
,因为HttpWebRequest
支持设置Timeout
的属性,如下:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(downloadUrl);
request.Timeout = 10000;
request.ReadWriteTimeout = 10000;
var wresp = (HttpWebResponse)request.GetResponse();
using (Stream file = File.OpenWrite(downloadFile))
{
wresp.GetResponseStream().CopyTo(file);
}
版权保护声明:本文未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册