[.NET].NET应用程序开发中如何修改WebClient对象的超时时间(timeout)?

.NET 作者: Rector 12阅读 0评论 0收藏 收藏本文

郑重申明:本文未经许可,禁止任何形式转载

问题描述

在.NET应用程序开发中,很多时候需要使用程序向远程的API发起HTTP请求。而.NET的程序集内置了一个可以发起HTTP请求的类:WebClientWebClient实现了下载/上传的一些方法,如: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);
}

阅读了该文章的人还浏览了...

本文永久链接码友网 » [.NET].NET应用程序开发中如何修改WebClient对象的超时时间(timeout)?

发布于: 2018-10-31 07:30:09
分享扩散: