Почему я получаю исключение: слишком много автоматических перенаправлений были предприняты на веб-клиенте?

В верхней части формы1 я сделал:

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)

Как я могу решить эту проблему, чтобы это не повторилось? И почему это произошло?

EDIT:

Я попытался изменить метод fileDownloadRadar на это, чтобы каждый раз выпускать клиент:

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

                    client.DownloadFileAsync(myUri, combinedTemp);

                }
            }
        }

Проблема заключается в том, что в конструкторе я использую Client и здесь он клиенту две разные переменные Webclient.

Как я могу решить эту проблему и исключение?

Это чернила websitel для сайта с изображением, которое я скачиваю каждую минуту. Еще не уверен, почему я получил это исключение после того, как он работал без проблем более 24 часов. Теперь я снова запустил программу снова, и она работает, но я задаюсь вопросом, не получу ли это исключение снова, или иногда в следующие часы.

Сайт с изображением, который я загружаю

Ответ 1

У меня была та же проблема с WebClient и нашла решение здесь: http://blog.developers.ba/fixing-issue-httpclient-many-automatic-redirections-attempted/

Использование HttpWebRequest и настройка CookieContainer решили проблему, например:

HttpWebRequest webReq = (HttpWebRequest)HttpWebRequest.Create(linkUrl);
try
{
    webReq.CookieContainer = new CookieContainer();
    webReq.Method = "GET";
    using (WebResponse response = webReq.GetResponse())
    {
        using (Stream stream = response.GetResponseStream())
        {
            StreamReader reader = new StreamReader(stream);
            res = reader.ReadToEnd();
            ...
        }
    }
}
catch (Exception ex)
{
    ...
}

Ответ 2

Если вы получаете исключение из описания, в котором указано, что существует слишком много перенаправлений, это связано с тем, что веб-сайт, к которому вы пытаетесь получить доступ, перенаправляется на другой сайт, который направляется на другой, а другой и т.д. предел перенаправления по умолчанию.

Итак, например, вы пытаетесь получить изображение с сайта A. Сайт A перенаправляет вас на сайт B. Сайт B перенаправляет вас на сайт C и т.д.

WebClient настроен для выполнения перенаправления до некоторого ограничения по умолчанию. Поскольку WebClient основан на HttpWebRequest, вероятно, он использует значение по умолчанию для MaximumAutomaticRedirections, что равно 50.

Скорее всего, либо есть ошибка на сервере, либо перенаправляется в узком цикле, либо они устали от того, что вы ударяете сервер за один и тот же файл раз в минуту, и они намеренно перенаправляют вас по кругу.

Единственный способ определить, что на самом деле происходит, - это изменить вашу программу, чтобы она автоматически не выполняла перенаправления. Таким образом, вы можете проверить URL перенаправления, возвращенный веб-сайтом, и определить, что действительно происходит. Если вы хотите это сделать, вам нужно использовать HttpWebRequest, а не WebClient.

Или вы можете использовать что-то вроде wget с включенным подробным протоколированием. Это покажет вам, что возвращает сервер, когда вы делаете запрос.

Ответ 3

Хотя это старая тема, я не мог не заметить, что на плакате использовался WebClient, который не использует UserAgent при выполнении запроса. Многие сайты будут отклонять или перенаправлять клиентов, у которых нет правильной строки UserAgent.

Рассмотрим настройку WebClient.Headers["User-Agent"]

Ответ 4

Проблема может быть решена путем установки контейнера cookie и, самое главное, установки webRequest.AllowAutoRedirect = false; следующим образом:

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

Ответ 5

У меня была эта ошибка, но я получил простое исправление.

Вам не нужен весь этот код, все, что вам нужно, это в начале вашего приложения загрузить cookie файл следующим образом (извините, но я работаю с VB :), но конвертировать довольно просто)

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

Ответ 6

Вот версия ответа @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