Laden...

WebRequest Error verhindern?

Erstellt von Fl0 vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.551 Views
F
Fl0 Themenstarter:in
4 Beiträge seit 2010
vor 13 Jahren
WebRequest Error verhindern?

Guten Tag,

ich arbeite seit längerem an einem Programm welches auf ein XML-Interface zugreift und ganz einfach die Daten mit WebRequest ausliest. Mit Hilfe eines Timers werden auf der Form verschiedene Label mit den ausgelesen Werten aktualisiert . Klappt auch alles wie gewollt, nur gibt es ab und zu einen Error. Ich habe Ewigkeiten gedacht ich hätte das Problem gelöst, aber scheinbar war es ein ganz anderes Problem:

Ich bin zu dem Ergebnis gekommen, dass bei schlechter Internetverbindung (oder keiner) ein Error kommt. Jedoch habe ich noch keine Lösung gefunden den Error zu unterdrücken oder zu warten bis eine Verbindung da ist. Aber genug gelabert, vielleicht könnt ihr mir ja helfen:

Form1.cs:

Webseite test = new Webseite("http://www.meineseite.de/api-" + apikey + ".xml");
label1.Text = test.getGuthabenTotal() + "€";

Website.cs:

public Webseite(string url)
        {
            bool reply = CheckInternetConnection();
            if (reply != false)
            {
                this.url = url;

                //Webseite laden
                WebRequest req = WebRequest.Create(this.url);
                WebResponse resp = req.GetResponse();
                Stream stream = resp.GetResponseStream();
                StreamReader sr = new StreamReader(stream);

                string s = sr.ReadToEnd();
                this.HTML = s;

                //Tags entfernen
                Regex textreplace = new Regex("(<[^>]*>)");
                this.Text = textreplace.Replace(this.HTML, "");
            }
        }

        public string getGuthabenTotal()
        {
            Regex titlematch = new Regex(@"(?<=<total.*>)([\s\S]*)(?=</total>)");
            return titlematch.Match(this.HTML).ToString();
        }

Die Funktion "CheckInternetConnection()" (s.o.) habe ich ausproniert ist jedoch keine effektive Lösung:


 public static bool CheckInternetConnection()
        {
            Ping ping = new Ping();

            try
            {
                PingReply reply = ping.Send("www.meineseite.de", 1000);

                return reply.Status == IPStatus.Success;
            }
            catch
            {
                return false;
            }
        }

Der Error besagt, dass string in Regex nicht NULL sein darf, desshalb gehe ich davon aus, dass die Funktion Regex nicht ausgeführt werden kann, da der HTML Code dank schlechter Verbindung nicht ausgelesen wurde. Ziel wäre also Regex zu sagen, dass er nichts machen soll, wenn nichts vorhanden ist - bisher aber nicht gelöst bekommen.

Auf eine Antwort würde ich mich sehr freuen.

Mit freundlichen Grüßen,
Fl0

P.S. den genauen Error werde ich ggb. hinzufügen, wenn er wieder auftritt.

203 Beiträge seit 2006
vor 13 Jahren

würde ja mal den kompeltten WebRequest teil in ein try { } catch { } auslagern
und fehlermeldungen richtig abfangen!

C
252 Beiträge seit 2007
vor 13 Jahren

Und da du ja anscheinend ein XML erhältst wurde ich empfehlen dieses mittels XPath oder LINQ auszulesen und nicht via RegEx.

87 Beiträge seit 2009
vor 13 Jahren

Stelle fest welche art von Fehler bei "Verbindungsfeheler" kommt. Schreibe dafür einen separate catchAnweisung und das ganze packst du in ne schleife:


        public void Huhu() 
        {
            // Zähler für Schleife
            int tmpCounter = 0;

            while (tmpCounter < 10)
            {
                try
                {
                    // verbinde zu Server

                    // führe aktion aus

                    // Aktion war erfolgreich
                    tmpCounter = 10; 
                }
                catch (Exception specialEx)
                {
                    // counter erhöhren
                    // Bei Verbindungsfeher
                    tmpCounter++;
                }
                catch (Exception ex)
                {
                    // do something
                }
            }
        }

que? como? no entiendo!!!!!

F
Fl0 Themenstarter:in
4 Beiträge seit 2010
vor 13 Jahren

Danke für die schnellen und hilfreichen antworten.

@esskar Werde ich mit der Methode von The_Mexican machen, danke.

@chavez bin mit der jetzigen voll zufrienden, wieso ändern? Aber Danke für den Tip.

@The_Mexican

So werde ich es wohl machen, habe den Error:

\************** Ausnahmetext **************
System.ArgumentNullException: Der Wert darf nicht NULL sein.
Parametername: input
   bei System.Text.RegularExpressions.Regex.Match(String input)
   bei Tool_Tool.Form1.timer2_Tick(Object sender, EventArgs e) in C:\Visual Studio 2008\Projects\Tool\Tool\Form1.cs:Zeile 418.
   bei System.Windows.Forms.Timer.OnTick(EventArgs e)
   bei System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
   bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Muss also statt "Exception1": "System.ArgumentNullException" oder "ArgumentNullException" benutzen? Und was hat es mit dem "#" auf sich? Würde da eher ne zweite Integer Variable nutzen und die auf z.B. 10 stellen und wenn x sowie die neue Variable 10 erreicht hat ausgeben, dass keine verbindung vorhanden ist.

Danke euch
Fl0

87 Beiträge seit 2009
vor 13 Jahren

catch (ArgumentNullException argNullEx)
{
    ...
   tmpCounter++
}

ist das zeichen für einen nummerischen Wert 😉 wie du sagtest z. B. 10 😉

greets und gutes gelingen

que? como? no entiendo!!!!!

203 Beiträge seit 2006
vor 13 Jahren
  
        public void Huhu()   
        {  
            // Zähler für Schleife  
            int tmpCounter = 0;  
  
            while (tmpCounter < 10)  
            {  
                try  
                {  
                    // Aktion war erfolgreich  
                    tmpCounter = 10;   
                }  
                // ...  
            }  
        }  
  

würde ich eher als

// Aktion war erfolgreich break;

schreiben!

F
Fl0 Themenstarter:in
4 Beiträge seit 2010
vor 13 Jahren

Danke euch!

Habe jetzt folgendes gemacht:

public Webseite(string url)
        {
            int tmpCounter = 0;

            while (tmpCounter < 10)
            {
                try
                {
                    this.url = url;

                    //Webseite laden
                    WebRequest req = WebRequest.Create(this.url);
                    WebResponse resp = req.GetResponse();
                    Stream stream = resp.GetResponseStream();
                    StreamReader sr = new StreamReader(stream);

                    string s = sr.ReadToEnd();
                    this.HTML = s;

                    //Tags entfernen
                    Regex textreplace = new Regex("(<[^>]*>)");
                    this.Text = textreplace.Replace(this.HTML, "");

                    // Aktion war erfolgreich
                    tmpCounter = 10;
                }
                catch (ArgumentNullException argNullEx)
                {
                    // counter erhöhren
                    // Bei Verbindungsfeher
                    tmpCounter++;
                }
                catch (WebException argNullEx)
                {
                    tmpCounter = 10;
                    MessageBox.Show("No Internet Connection ! :(");
                }
           }
                 
         }

Problem ist, dass im catch Beispiel "WebException=Null" die Message Box dauernd wieder aufgerufen wird, kann man das verhindern? Denke das liegt ja am Timer der auf ziemlich häufige 1,2 Sek. eingestellt ist und dementsprechend immer wieder die Funktion aufruft.(wird noch geändert)

Würde dann bei der WebException den Timer drastisch erhöhen und sofern alles klappt und man in kein "catch" kommt den TImer wieder erhöhen.

Danke und MfG
Fl0

87 Beiträge seit 2009
vor 13 Jahren

also,

copy paste ist kein schöner stil 😉 s.h. die Benamung deiner Exception-objekte


        public Webseite(string url)
        {
            int tmpCounter = 0;
            try
            {
                while (tmpCounter < 10)
                {
                    try
                    {
                        this.url = url;

                        //Webseite laden
                        //...
                
                        //Tags entfernen
                        //...

                        // Aktion war erfolgreich
                        break;
                    }
                    catch (ArgumentNullException argNullEx)
                    {
                        // counter erhöhren
                        // Bei Verbindungsfeher
                        tmpCounter++;
                    }
               }
               if(counter = 10)
               {
                   // messageBox.show("internetverbindung)
               }
            }
            catch(Exception ex)
            {
                // do something;
                // Schreib in log, oder ähnliches what ever ;)
            }
         }

die msg box wird jetzt nur aufgerufen wenn du innerhalb der Anzahl versuche die gewünschte Aktion nicht erfolgreich ausführen konntest.

que? como? no entiendo!!!!!