web-dev-qa-db-fra.com

Pourquoi j'obtiens une exception: trop de redirections automatiques ont été tentées sur le client Web?

En haut de la page 1, j'ai fait:

WebClient Client;

Puis dans le constructeur:

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

Ensuite, j'ai cette méthode que j'appelle chaque minute:

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

Toutes les minutes, il télécharge une image d'un site Web à la même image chaque fois ... Tout fonctionnait pendant plus de 24 heures sans aucun problème jusqu'à présent, en lançant cette exception dans l'événement de téléchargement terminé:

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();
            }
        }

Maintenant, il s'est arrêté à l'intérieur du if (e.Error! = Null) Sur la ligne: timer1.Stop ();

Puis je vois sur l'erreur l'erreur: C'est la trace de la pile:

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

Comment puis-je résoudre ce problème pour qu'il ne se reproduise plus? Et pourquoi c'est arrivé?

MODIFIER:

J'ai essayé de changer la méthode fileDownloadRadar à ceci pour libérer le client à chaque fois:

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

                    client.DownloadFileAsync(myUri, combinedTemp);

                }
            }
        }

Le problème est que dans le constructeur, j'utilise Client et ici, il s'agit de deux variables Web Client différentes.

Comment puis-je résoudre ceci et l'exception?

Il s'agit de l'encre Websitel du site avec l'image que je télécharge toutes les minutes. Je ne suis toujours pas sûr de savoir pourquoi j’ai eu cette exception après avoir fonctionné sans problèmes pendant plus de 24 heures . parfois dans les prochaines heures.

Le site avec l'image que je suis en train de télécharger

13
Haim Shaban

J'ai eu le même problème avec WebClient et j'ai trouvé la solution ici: http://blog.developers.ba/fixing-issue-httpclient-many-automatic-redirections-attempted/

Utiliser HttpWebRequest et définir un CookieContainer a résolu le problème, par exemple:

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)
{
    ...
}
24
Ron.Eng

Si vous obtenez une exception avec une description indiquant qu'il y a trop de redirections, c'est parce que le site Web auquel vous essayez d'accéder redirige vers un autre site, qui dirige vers un autre site, etc., au-delà des redirections par défaut. limite.

Ainsi, par exemple, vous essayez d'obtenir une image du site A. Le site A vous redirige vers le site B. Le site B vous redirige vers le site C, etc. 

WebClient est configuré pour suivre les redirections jusqu'à une limite par défaut. Puisque WebClient est basé sur HttpWebRequest , il est probable qu’il utilise la valeur par défaut pour MaximumAutomaticRedirections , qui est 50.

Très probablement, soit il y a un bogue sur le serveur et la redirection est très serrée, soit ils en ont marre que vous frappiez le serveur pour le même fichier une fois par minute et qu'ils délibérément vous redirigent en cercle.

Le seul moyen de déterminer ce qui se passe réellement est de modifier votre programme afin qu'il ne suive pas automatiquement les redirections. De cette façon, vous pouvez examiner l'URL de redirection renvoyée par le site Web et déterminer ce qui se passe réellement. Si vous voulez faire cela, vous devrez utiliser HttpWebRequest plutôt que WebClient.

Ou, vous pouvez utiliser quelque chose comme wget avec la journalisation détaillée activée. Cela vous montrera ce que le serveur renvoie lorsque vous faites une demande.

8
Jim Mischel

Le problème peut être résolu en définissant un conteneur de cookies et surtout en définissant webRequest.AllowAutoRedirect = false; comme ceci:

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

Bien qu'il s'agisse d'un sujet ancien, je ne pouvais pas m'empêcher de remarquer que le poster utilisait WebClient, qui n'utilise aucun UserAgent lors de la demande. De nombreux sites rejetteront ou redirigeront les clients qui ne possèdent pas une chaîne UserAgent appropriée.

Envisagez de définir le WebClient.Headers["User-Agent"]

2
Howard

J'ai eu cette erreur mais j'ai eu une solution simple.

Vous n'avez pas besoin de tout ce code, il vous suffit de télécharger le cookie comme ceci au début de votre application (désolé, mais je travaille avec VB :), mais la conversion est assez simple)

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