You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:17:42