2014-10-30 4 views
11

In der Spitze form1 ich tat:Warum bekomme ich eine Ausnahme: Zu viele automatische Umleitungen wurden auf dem Webclient versucht?

WebClient Client; 

Dann im Konstruktor:

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

Dann habe ich diese Methode Ich rufe jede Minute:

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

Jede Minute es wird jedes Mal ein Bild von einer Website heruntergeladen. Es funktioniert alles für mehr als 24 Stunden keine Probleme unbis diese Ausnahme in dem Download-Vorgang abgeschlossen Ereignis zu werfen:

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

Jetzt hielt es innerhalb des if (e.Error! = Null) Auf der Linie: timer1 .Halt();

Dann sehe ich auf dem Fehler den Fehler: Dies ist der Stack-Trace:

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

Wie kann ich dieses Problem lösen, damit es nicht wieder passieren wird? Und warum ist es passiert?

EDIT:

Ich versuchte, die fileDownloadRadar Methode, dies zu ändern, dem Kunden jedes Mal freizugeben:

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

        client.DownloadFileAsync(myUri, combinedTemp); 

       } 
      } 
     } 

Das Problem ist, dass ich Kunden im Konstruktor bin mit und hier ist es Client zwei verschiedene Webclient-Variablen.

Wie kann ich dies und die Ausnahme lösen?

Dies ist die Websitel Tinte für die Website mit dem Bild, das ich jede Minute herunterladen werde. Immer noch nicht sicher, warum ich diese Ausnahme bekam, nachdem es mehr als 24 Stunden keine Probleme hatte. Nun habe ich das Programm nochmal ausgeführt und es funktioniert, aber ich frage mich, ob ich diese Ausnahme morgen oder in den nächsten Stunden wieder bekomme.

The site with image i'm downloading

+0

meine Frage aktualisiert. Ich versuche, Using mit dem Webclient zu verwenden, aber nicht sicher, dass dies die Lösung für die Ausnahme ist. Und das zweite Problem ist die Verwendung von Using, da ich jetzt zwei verschiedene WebClient-Variablen habe und das ist falsch. –

+0

Der von Ihnen beschriebene Fehler hat nichts mit 'using' zu tun. Wenn Sie eine einzelne "WebClient" -Instanz auf Klassenebene verwenden möchten, sollten Sie in Ihrer Download-Methode keine 'using'-Anweisung verwenden. Hast du meine Antwort gelesen? –

Antwort

7

Wenn Sie eine Ausnahme mit einer Beschreibung erhalten, dass zu viele Umleitungen sagt, es gibt, dann ist es, weil die Website, die Sie zugreifen möchten, wird auf eine andere Website umgeleitet, die zu einem anderen leitet, und ein anderes usw. über das Standardumleitungslimit hinaus.

So zum Beispiel, versuchen Sie ein Bild von der Baustelle A. Site zu erhalten A Sie Umleitungen an Standort B Standort B leitet Sie auf Seite C usw.

WebClient konfiguriert ist, Umleitungen, um einige zu verfolgen Standardlimit. Da WebClient auf HttpWebRequest basiert, ist es wahrscheinlich, dass es den Standardwert für MaximumAutomaticRedirections verwendet, die 50

Wahrscheinlich ist, entweder gibt es einen Fehler auf dem Server, und es ist in einer engen Schleife umleiten, oder sie müde von Ihnen den Server für die gleiche Datei einmal pro Minute schlagen und sie sind absichtlich umleiten Sie in einem Kreis.

Die einzige Möglichkeit zu bestimmen, was wirklich passiert, ist, Ihr Programm so zu ändern, dass es Umleitungen nicht automatisch folgt. Auf diese Weise können Sie die von der Website zurückgegebene Umleitungs-URL überprüfen und feststellen, was wirklich vor sich geht. Wenn Sie das tun möchten, müssen Sie HttpWebRequest statt WebClient verwenden.

Oder Sie könnten etwas wie wget mit ausführlichen Protokollierung eingeschaltet verwenden. Das zeigt Ihnen, was der Server zurückgibt, wenn Sie eine Anfrage stellen.

+0

Downvoter: Es ist üblich, einen Kommentar zu hinterlassen, in dem erklärt wird, warum die Antwort den Downvote verdient hat. Ist meine Antwort irgendwie inkorrekt? –

+0

Seit wann ist es üblich, einen Kommentar zu hinterlassen? Habe ich ein Memo verpasst? – rene

+0

Nichts scheint falsch mit Ihrer Antwort, könnte ein Fall von [verlorene Schlüssel] sein (https://meta.stackexchange.com/a/215397/158100) – rene

20

hatte ich das gleiche Problem mit WebClient und die Lösung hier gefunden: http://blog.developers.ba/fixing-issue-httpclient-many-automatic-redirections-attempted/

HttpWebRequest verwenden und Einstellung ein Cookie das Problem, zum Beispiel gelöst:

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) 
{ 
    ... 
} 
+1

Mann, du hast mich gerettet –

1

Obwohl dies ist ein altes Thema, Ich konnte nicht umhin zu bemerken, dass das Poster den WebClient benutzte, der keinen UserAgent benutzt, wenn er die Anfrage macht. Viele Websites werden Clients ablehnen oder umleiten, die keine richtige UserAgent-Zeichenfolge haben.

Betrachten Sie die WebClient.Headers["User-Agent"]

+0

Das Einstellen des Benutzeragenten war was für mich tatsächlich funktionierte. Danke, dass du dich daran erinnerst. – Jack

2

Problem Einstellung kann durch wie diese Einstellung webRequest.AllowAutoRedirect = false; durch Setzen eines Cookies Container und vor allem gelöst werden:

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

Kannst du das sehen? https://stackoverflow.com/questions/48278333/php-curl-to-net-httprequest-files-uploading-to-server –

Verwandte Themen