VB.NET 2015两种文件下载方式遇WebClient重定向次数过多错误求助
解决VB.NET中WebClient下载时“Too many automatic redirections”错误的方案
嘿,这个问题我之前碰到过类似的!那个Caixa的服务器确实有点重定向的小脾气,咱们来一步步搞定它。
问题根源
出现这个错误的核心原因是:WebClient和My.Computer.Network.DownloadFile默认允许的自动重定向次数有限(默认是10次),而目标服务器要么存在循环重定向,要么从HTTP跳转HTTPS的过程中触发了多次跳转,超过了默认限制。另外,有些服务器会因为请求没有携带合法的User-Agent头,故意返回重定向响应,也会导致这个问题。
解决方案一:自定义WebClient扩展重定向限制
我们可以继承WebClient类,重写GetWebRequest方法来调整重定向次数,同时添加合法的User-Agent头,避免被服务器拦截:
Public Class ExtendedWebClient Inherits WebClient Protected Overrides Function GetWebRequest(address As Uri) As WebRequest Dim request As HttpWebRequest = DirectCast(MyBase.GetWebRequest(address), HttpWebRequest) ' 增加允许的重定向次数到20次(可根据实际情况调整) request.MaximumAutomaticRedirections = 20 ' 确保自动重定向功能开启 request.AllowAutoRedirect = True ' 添加浏览器风格的User-Agent,避免被服务器识别为爬虫 request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" Return request End Function End Class
然后用这个自定义类替换原来的WebClient:
' 使用扩展后的WebClient下载 Dim myWebClient As New ExtendedWebClient() Try myWebClient.DownloadFile("http://www1.caixa.gov.br/loterias/_arquivos/loterias/D_lotfac.zip", "x:\temp\D_lotfac.zip") Catch ex As Exception ' 这里可以添加异常处理逻辑 MessageBox.Show("下载失败:" & ex.Message) Finally myWebClient.Dispose() End Try
解决方案二:直接使用HTTPS链接(更简单)
观察目标链接,现在很多政府网站都强制HTTPS访问,原HTTP链接可能会被服务器反复重定向到HTTPS版本,导致次数超限。你可以直接把链接换成HTTPS开头试试:
' 第一种方式改用HTTPS链接 Dim myWebClient As New WebClient() myWebClient.DownloadFile("https://www1.caixa.gov.br/loterias/_arquivos/loterias/D_lotfac.zip", "x:\temp\D_lotfac.zip") ' 第二种方式同样改用HTTPS链接 My.Computer.Network.DownloadFile("https://www1.caixa.gov.br/loterias/_arquivos/loterias/D_lotfac.zip", "x:\temp\D_lotfac.zip", "", "", True, 60000, True)
这个方法大概率能解决问题,因为跳过了HTTP到HTTPS的多次跳转环节。
解决方案三:针对My.Computer.Network.DownloadFile的手动重定向处理
如果一定要用My.Computer.Network.DownloadFile,可以先手动获取最终的跳转URL,再用这个URL进行下载:
Function GetFinalRedirectUrl(originalUrl As String) As String Dim request As HttpWebRequest = DirectCast(WebRequest.Create(originalUrl), HttpWebRequest) request.MaximumAutomaticRedirections = 20 request.AllowAutoRedirect = True request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" Using response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse) Return response.ResponseUri.ToString() End Using End Function ' 使用最终URL下载 Try Dim finalUrl As String = GetFinalRedirectUrl("http://www1.caixa.gov.br/loterias/_arquivos/loterias/D_lotfac.zip") My.Computer.Network.DownloadFile(finalUrl, "x:\temp\D_lotfac.zip", "", "", True, 60000, True) Catch ex As Exception MessageBox.Show("下载失败:" & ex.Message) End Try
额外注意事项
- 确保目标路径
x:\temp已经存在,否则会抛出路径不存在的异常; - 如果下载仍然失败,可以检查是否需要代理服务器,或者服务器是否有IP限制;
- 记得在使用完
WebClient后调用Dispose()方法释放资源,或者用Using语句自动管理。
内容的提问来源于stack exchange,提问作者Antonio Carlos
相关产品推荐
相关产品推荐

