为什么我会遇到异常:在webclient上尝试过多的自动重定向?

时间:2014-10-30 13:31:50

标签: c# .net winforms

在form1的顶部,我做了:

WebClient Client;

然后在构造函数中:

Client = new WebClient();
Client.DownloadFileCompleted += Client_DownloadFileCompleted;
Client.DownloadProgressChanged += Client_DownloadProgressChanged;

然后我有这种方法我每分钟都在呼叫:

private void fileDownloadRadar()
        {
            if (Client.IsBusy == true)
            {
                Client.CancelAsync();
            }
            else
            {
                Client.DownloadProgressChanged += Client_DownloadProgressChanged;
                Client.DownloadFileAsync(myUri, combinedTemp);
            }
        }

每次分钟都会从网站上下载相同图片的图片。 这一切都工作超过24小时没有问题,直到现在在下载完成事件中抛出此异常:

private void Client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {

            if (e.Error != null)
            {
                timer1.Stop();
                span = new TimeSpan(0, (int)numericUpDown1.Value, 0);
                label21.Text = span.ToString(@"mm\:ss");
                timer3.Start();
            }
            else if (!e.Cancelled)
            {
                label19.ForeColor = Color.Green;
                label19.Text = "חיבור האינטרנט והאתר תקינים";
                label19.Visible = true;
                timer3.Stop();
                if (timer1.Enabled != true)
                {
                    if (BeginDownload == true)
                    {
                        timer1.Start();
                    }
                }                
                bool fileok = Bad_File_Testing(combinedTemp);
                if (fileok == true)
                {
                    File1 = new Bitmap(combinedTemp);
                    bool compared = ComparingImages(File1);
                    if (compared == false)
                    {

                        DirectoryInfo dir1 = new DirectoryInfo(sf);
                        FileInfo[] fi = dir1.GetFiles("*.gif");
                        last_file = fi[fi.Length - 1].FullName;
                        string lastFileNumber = last_file.Substring(82, 6);
                        int lastNumber = int.Parse(lastFileNumber);
                        lastNumber++;
                        string newFileName = string.Format("radar{0:D6}.gif", lastNumber);
                        identicalFilesComparison = File_Utility.File_Comparison(combinedTemp, last_file);
                        if (identicalFilesComparison == false)
                        {
                            string newfile = Path.Combine(sf, newFileName);
                            File.Copy(combinedTemp, newfile);
                            LastFileIsEmpty();
                        }
                    }
                    if (checkBox2.Checked)
                    {
                        simdownloads.SimulateDownloadRadar();
                    }
                }
                else
                {
                    File.Delete(combinedTemp);
                }
                File1.Dispose();
            }
        }

现在它停在if(e.Error!= null)里面 在线:timer1.Stop();

然后我在错误上看到错误: 这是堆栈跟踪:

at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
   at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result)
   at System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result)

我如何解决这个问题,以免再次发生?为什么会这样?

编辑:

我尝试将fileDownloadRadar方法更改为此方法,以便每次都释放客户端:

private void fileDownloadRadar()
        {
            using (WebClient client = new WebClient())
            {
                if (client.IsBusy == true)
                {
                    client.CancelAsync();
                }
                else
                {

                    client.DownloadFileAsync(myUri, combinedTemp);

                }
            }
        }

问题在于,在构造函数中我使用Client和客户端两个不同的Webclient变量。

我如何解决这个问题和例外?

这是网站的网站墨水,图片每分钟下载一次。 仍然不确定为什么我在超过24小时没有问题之后得到这个例外。 现在我再次运行该程序并且它正在工作,但我想知道我是否会再次获得此异常,或者有时会在接下来的几个小时内。

The site with image i'm downloading

5 个答案:

答案 0 :(得分:8)

如果您收到的描述说明有太多重定向的例外,那是因为您尝试访问的网站正在重定向到另一个网站,该网站指向另一个网站,而另一个网站则指向另一个网站。默认的重定向限制。

因此,例如,您尝试从站点A获取图像。站点A将您重定向到站点B.站点B将您重定向到站点C等。

WebClient配置为遵循重定向到某个默认限制。由于WebClient基于HttpWebRequest,因此它可能使用MaximumAutomaticRedirections的默认值,即50。

最有可能的是,服务器上有一个错误并且它在一个紧密的循环中重定向,或者他们厌倦了你每分钟一次点击同一个文件的服务器而且他们故意将你重定向到一个圆圈。

确定实际情况的唯一方法是更改​​程序,使其不会自动遵循重定向。这样,您可以检查网站返回的重定向URL并确定实际发生的情况。如果您想这样做,则需要使用HttpWebRequest而不是WebClient

或者,您可以使用类似wget的内容,并启用详细日志记录。这将显示服务器在您发出请求时返回的内容。

答案 1 :(得分:3)

虽然这是一个古老的主题,但我无法帮助,但我注意到海报使用的WebClient在发出请求时不使用UserAgent。许多网站会拒绝或重定向没有正确UserAgent字符串的客户。

考虑设置WebClient.Headers["User-Agent"]

答案 2 :(得分:2)

问题可以通过设置cookie容器来解决,最重要的是通过这样设置webRequest.AllowAutoRedirect = false;

HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(url);
webRequest.CookieContainer = new CookieContainer();
webRequest.AllowAutoRedirect = false;

答案 3 :(得分:0)

我遇到了这个错误,但是得到了一个简单的解决方法。

您不需要所有这些代码,只需要在应用程序的开头下载这样的cookie(对不起,但是我使用VB :),但转换起来非常简单)

[your application namespace].Application.GetCookie(New Uri("https://[site]"))

答案 4 :(得分:0)

这是@ Ron.Eng的答案的VB.Net版本:

Public Function DownloadFileWithCookieContainerWebRequest(URL As String, FileName As String)

    Dim webReq As HttpWebRequest = HttpWebRequest.Create(URL)
    Try

        webReq.CookieContainer = New CookieContainer()
        webReq.Method = "GET"
        Using response As WebResponse = webReq.GetResponse()
            Using Stream As Stream = response.GetResponseStream()
                Dim reader As StreamReader = New StreamReader(Stream)
                Dim res As String = reader.ReadToEnd()
                File.WriteAllText(FileName, res)
            End Using
        End Using
    Catch ex As Exception
        Throw ex
    End Try

End Function