Fehler abfangen bei fehlender Internetverbindung

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Fehler abfangen bei fehlender Internetverbindung

    Hallo und guten Morgen,

    mein Programm ermittelt u.a. die Wetteraussichten für die nächsten Tage.
    Nun scheint die Seite nicht erreichbar zu sein.
    Die nachstehende Funktion gibt mir folgende Fehlermeldung zurück:

    Zusätzliche Informationen: Die zugrunde liegende Verbindung wurde geschlossen: Unbekannter Fehler beim Empfangen..

    VB.NET-Quellcode

    1. Private Function Webseite(ByVal WebLink As String) As String
    2. Me.InternetverbindungOK = False
    3. Try
    4. Dim hReq As HttpWebRequest = DirectCast(HttpWebRequest.Create(WebLink), HttpWebRequest)
    5. Dim hRes As HttpWebResponse = DirectCast(hReq.GetResponse(), HttpWebResponse)
    6. Dim s As Stream = hRes.GetResponseStream()
    7. Dim sR As New StreamReader(s)
    8. Dim webPage As String = sR.ReadToEnd()
    9. sR.Close()
    10. s.Close()
    11. sR = Nothing
    12. s = Nothing
    13. hReq = Nothing
    14. hRes = Nothing
    15. Me.InternetverbindungOK = True
    16. Return webPage
    17. Catch ex As Exception
    18. Me.InternetverbindungOK = False
    19. Return Nothing
    20. End Try
    21. End Function


    Der Try - Catch greift hier nicht
    Gruß Markus
    Dazu eine Frage: In welcher Zeile genau tritt der Fehler auf?
    Wenn er in der Zeile, in der du den Response Stream liest (in deinem obrigen Fall Zeile #11), dann könntest du vorher auf den HTTP Status Code prüfen, ob der Server überhaupt verfügbar ist oder nicht (Statuscode 503)

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    @Westerwälder: Dein Code funktioniert bei mir, wenn ich ihn mit z.B. MessageBox.Show(Webseite("http://www.ixquick.com")) und bestehender Verbindung aufrufe. Dabei habe ich Dein Try...Catch wegkommentiert, um mir die Exceptions anzeigen zu lassen, falls doch was schiefgeht. Wenn ich keine Verbindung habe, kommt bei mir ne saubere System.Net.WebException: "Der Remotename konnte nicht aufgelöst werden: 'www.ixquick.com'". An Deinem geposteten Code scheint es also nicht zu liegen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Westerwälder Vielleicht fängst Du mit einem Ping auf die Seite an, gugst Du z.B. hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe den Link mal getestet
    wetter.com/wetter_aktuell/wett…rhersage/?id=DE0003988004
    Erhalte im Browser den Fehler: Netzwerk-Zeitüberschreitung
    Muss das doch irgendwie abfangen können.
    Deswegen habe ich doch die Variable InternetverbindungOK

    VB.NET-Quellcode

    1. Me.WebDokument = Me.Webseite("Http://www.wetter.com/wetter_aktuell/wettervorhersage/16_tagesvorhersage/?id=DE0003988004")
    2. If Me.InternetverbindungOK = False Then
    3. Zeiten.Wetterdaten.EreignisText = "Wetterdaten: Es besteht keine Internetverbindung"
    4. Zeiten.Wetterdaten.VorgangNr += 1
    5. Exit Sub
    6. End If


    Wird der VorgangNr grösser 4 stellt das Programm den Download ein. User bekommt dann eine Mitteilung das mit dem Link was nicht stimmt.

    Ich denke nun mal laut.
    Diese Sache wird von einem Timer geprüft. (alle 10 Sekunden)
    Wann möchte man Wetter aktualisieren (bei mir alle 5 Stunden, oder bei Programmstart)
    Benzinpreise stündlich
    Prüfung eMail-Eingang alle 10 Minuten

    Das diese Zeitüberschreitung dann alles durcheinander bringt

    Gruß Markus

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Westerwälder“ ()

    Nur zur Info. Im Radio hieß es gestern, dass ein Wetter-Daten Anbieter Probleme mit seiner IT hat und daher etliche Portale nicht mit Daten füttern können. Wetter.com gehörte glaub auch zu den Betroffenen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @Westerwälder Genau dafür gibt es das Ping. Siehe Post #6.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke Rod
    aber das anpingen und auswerten dauert doch auch seine Zeit
    und wann kommt sowas vor, in drei Jahren gestern das erste mal

    Könnte man die Funktion nicht so umstellen, dass er nur pingt falls nichts zurück kommt?
    Gruß Markus

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Westerwälder“ ()

    Westerwälder schrieb:

    Könnte man die Funktion nicht so umstellen, dass er nur pingt falls nichts zurück kommt?
    heißt etwa so was:
    Ich sehe nur dann nach, ob Licht im Fenster ist, wenn der Kollege auf das Klingeln nicht reagiert. :thumbsup:
    Ping geht einfach schneller.
    Probier einfach mal ein Ping und Deine Abfrage mit einer Fantasie-Adresse.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    bin ja froh das du immer noch Humor hast wenn ich so unlogische Vorschläge in den Raum werfe.
    ich texte dann mal den Code wenn ich dich Pingabfrage in der Funktion drin habe.
    Und gelernt habe ich immer noch GW Basic

    Ist genau wie bei den Autos
    mein erster Wagen war ein uralter BMW 318 (Sauger, glaube 98 PS)
    Heute sitzt man in einem F10 - glaube nicht das ich 50 Prozent von dem nutze was mir der Wagen anbietet
    Gruß Markus

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Westerwälder“ ()

    Guten Morgen,
    möchte das Thema nochmals ansprechen.
    Habe nun die Ping-Überprüfung in der Function eingebaut. Funktioniert schon eine Weile.
    Seit heute kann ich eine Webseite nicht erreichen. Es wird ein Timeout-Fehler gemeldet, die Pingabfrage funktioniert aber wohl.
    Der zweite Try ... Catch greift hier nicht und die Anwendung stoppt.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function Webseite(ByVal WebLink As String, Optional Pingen As Boolean = True) As String
    2. Me.InternetverbindungOK = False
    3. If Not My.Computer.Network.IsAvailable Then
    4. Fehlermeldung.Schreiben("Downloadcenter: Rechner " & Rechner.Name & " hat keine aktive Internetverbindung.")
    5. Return Nothing
    6. Exit Function
    7. End If
    8. Dim PingLink As String = Nothing
    9. Dim Uri As New Uri(WebLink)
    10. Dim hReq As HttpWebRequest = Nothing
    11. Dim hRes As HttpWebResponse = Nothing
    12. Dim WebStream As Stream = Nothing
    13. Dim WebStreamReader As StreamReader = Nothing
    14. Dim WebPage As String = Nothing
    15. If Pingen Then
    16. Try
    17. Me.SuchPos = WebLink.IndexOf(".")
    18. Me.DifLaenge = WebLink.Length - Me.SuchPos - 1
    19. PingLink = Strings.Right(WebLink, Me.DifLaenge)
    20. Me.SuchPos = PingLink.IndexOf("/")
    21. PingLink = Strings.Left(PingLink, Me.SuchPos)
    22. Me.SuchPos = -1
    23. Me.DifLaenge = 0
    24. If Not My.Computer.Network.Ping(PingLink, 1000) Then
    25. Fehlermeldung.Schreiben("Downloadcenter: Webseite " & PingLink & " meldet keinen Ping zurück. Versuche ohne Ping zu lesen.")
    26. Me.Webseite(WebLink, False)
    27. End If
    28. Catch ex As Exception
    29. Me.SuchPos = -1
    30. Me.DifLaenge = 0
    31. Fehlermeldung.Schreiben("Downloadcenter: Webseite " & PingLink & " Fehler beim Ping - " & ex.Message)
    32. Return Nothing
    33. Exit Function
    34. End Try
    35. End If 'Pingen
    36. hReq = DirectCast(HttpWebRequest.Create(Uri), HttpWebRequest)
    37. With hReq
    38. .Timeout = 10000
    39. .Method = "GET"
    40. End With
    41. Try
    42. hRes = DirectCast(hReq.GetResponse, HttpWebResponse) ' Fehler: Timeout
    43. WebStream = hRes.GetResponseStream
    44. WebStream.ReadTimeout = 3000
    45. WebStreamReader = New StreamReader(WebStream)
    46. WebPage = WebStreamReader.ReadToEnd
    47. WebStream.Close()
    48. WebStream = Nothing
    49. WebStreamReader.Close()
    50. WebStreamReader = Nothing
    51. hReq = Nothing
    52. hRes = Nothing
    53. Me.InternetverbindungOK = True
    54. Return WebPage
    55. Catch ex As Exception
    56. Me.InternetverbindungOK = False
    57. Fehlermeldung.Schreiben("Downloadcenter: Webseite " & WebLink & ", Fehler bei Aufbau einer Internetverbindung: " & ex.Message)
    58. Return Nothing
    59. End Try
    60. End Function


    Hier der Aufruf:
    Me.WebDokument = Me.Webseite("http://www.clever-tanken.de/tankstelle_liste?spritsorte=7&ort=56457")


    Gruß Markus

    Westerwälder schrieb:

    Timeout für Vorgang überschritten
    Da war wohl keine Gegenstelle verfügbar.
    Teste Deinen Code, indem Du mit Dir selbst (demselben PC) via Netzwerkkarte kommunizierst, IP = 127.0.0.1.
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Westerwälder schrieb:

    Nur was tun wenn die Gegenstelle nicht verfügbar ist?
    Dann fange explizit das TimeOut ab und tue, was getan werden muss, z.B. MessageBox, dass der Provider angerufen werden soll. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!