WebResponse kann "eigentlich" nichts zurückgeben

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

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von KingLM97.

    WebResponse kann "eigentlich" nichts zurückgeben

    Heyho,

    ich schreibe aktuell ein Programm, welches XML-Dateien aus dem Internet zieht. In diesen XML-Dateien stehen Links zu verschiedenen Programmen. Das Programm soll nun prüfen, ob diese Links auch erreichbar (also downloadbar!) sind. Es funktioniert auch einwandfrei, nur habe ich das Problem, dass bei einigen Links eine "falsche" Antwort zurückkommt. Als beispiel dieser Link: Klick mich :)
    Eigentlich sollte doch ein Fehler dann auftreten, oder nicht?

    Das ist mein kleiner Code, der die Links überprüft:

    VB.NET-Quellcode

    1. Private Sub überprüfeInhalt(ByVal strURL As String, ByVal strLabelPfad As String)
    2. File.CreateText(Application.StartupPath & "\Inhalt.xml").Close()
    3. If strURL.StartsWith("http") = False Then
    4. strURL = "http://" & strURL
    5. End If
    6. Dim webclient As New WebClient
    7. webclient.DownloadFile(strURL, Application.StartupPath & "\Inhalt.xml")
    8. Dim reader As XmlTextReader = New XmlTextReader(Application.StartupPath & "\Inhalt.xml")
    9. Do While reader.Read
    10. If reader.NodeType = XmlNodeType.Text Then
    11. Try
    12. Dim anfrage As WebRequest = DirectCast(WebRequest.Create(strURL), WebRequest)
    13. Dim antwort As WebResponse = DirectCast(anfrage.GetResponse(), WebResponse)
    14. antwort = anfrage.GetResponse
    15. antwort.Close()
    16. lvAusgabe.Items.Add(strLabelPfad & " " & reader.Value).BackColor = Color.LightGreen
    17. Catch ex As Exception
    18. lvAusgabe.Items.Add(strLabelPfad & " " & reader.Value).BackColor = Color.Red
    19. End Try
    20. lvAusgabe.Update
    21. End If
    22. Loop
    23. reader.Close()
    24. File.Delete(Application.StartupPath & "\Inhalt.xml")
    25. End Sub​


    Ich habe zuerst versucht, die Datei mit 'DownloadString' herunter zu laden und dann nach "Fehler, Error, ..." weiß sonst noch was zu durchsuchen, allerdings ist das sehr sehr langsam und frisst Arbeitsspeicher bis zum geht nimmer.
    Kann mir da einer Weiterhelfen?

    Grüße,
    KingLM97

    P.S.: Ich weiß, ist wahrscheinlich schlechter Code und Denglisch, aber ich bin dabei mich zu verbessern! :)
    Hallo @KingLM97:

    Also nochmal um dein Problem zusammen zu fassen: Du wunderst dich, warum du bei einer URL, die auf ein nicht existentes Ziel (Datei) hinweist, keinen Fehler bekommst. Hab ich das richtig verstanden?
    Schau mal folgendes, Punkt #2:

    KingLM97 schrieb:

    Ich weiß, ist wahrscheinlich schlechter Code und Denglisch, aber ich bin dabei mich zu verbessern!

    1.) Verwende andere Methodenbezeichnungen: Wenn du auf eine andere Sprache unsteigst, kann es passieren, dass der Compiler das 'ü' nicht kennt.
    2.) Wenn du Try Catch verwendest, solltest du dir immer im Klaren sein, WARUM du jetzt ein Try Catch verwendest! TryCatch ist ein heißes Eisen
    Warscheinlich bekommst du einen Fehler der wird nur in deinem Try Catch unter gehen!
    3.) Wenn du dir eine Funktionalität baust, die dir etwas prüft, dann solltes du auch als Type eine Funktion verwenden und keine Sub. Vorschlag: mach aus dem Sub eine Function, pack als Rückgabewert ein Boolean rein, leg dir die URLs in einem Dictionary(string, bool) ab und ruf die Funktion mit jedem Eintrag der Liste ab und setzt den entsprechenden bool Wert mit dem Rückgabewert aus der Funktion.
    4.) Trenne Code und UI. Du greifst hier im Code direkt auf das UI zu (Code Zeile #117 und #19)

    Lg Radianator
    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
    Hallo @Radinator

    Danke für die Tipps, werde ich demnächst berücksichtigen und versuchen umzusetzen.

    Die XML-Datei(en) sehen allesamt so aus:
    Spoiler anzeigen

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <Downloadpfade>
    3. <mssql321>http://www.afs-software.com/downloads/MSSQL Server 2008 aR2.exe</mssql321>
    4. <mssql322>http://www.afs-software.de/downloads/MSSQL Server 2008 R2.exe</mssql322>
    5. <mssql641>http://www.afs-software.com/downloads/MSSQL Server 2008 R2.exe</mssql641>
    6. <mssql642>http://www.afs-software.de/downloads/MSSQL Server 2008 R2.exe</mssql642>
    7. <mssql2012321>http://www.afs-software.de/downloads/AFS2012x32.EXE</mssql2012321>
    8. <mssql2012322>http://www.afs-software.com/downloads/AFS2012x32.EXE</mssql2012322>
    9. <mssql2012641>http://www.afs-software.de/downloads/AFS2012x64.EXE</mssql2012641>
    10. <mssql2012642>http://www.afs-software.com/downloads/AFS2012x64.EXE</mssql2012642>
    11. <msbat321>http://www.afs-software.de/downloads/install32.txt</msbat321>
    12. <msbat322>http://www.afs-software.com/downloads/install32.txt</msbat322>
    13. <msbat641>http://www.afs-software.de/downloads/install64.txt</msbat641>
    14. <msbat642>http://www.afs-software.com/downloads/install64.txt</msbat642>
    15. <maria321>https://downloads.mariadb.org/f/mariadb-10.1.12/win32-packages/mariadb-10.1.12-win32.msi/from/http%3A//mirror2.hs-esslingen.de/mariadb/?serve</maria321>
    16. <maria322>https://downloads.mariadb.org/interstitial/mariadb-10.0.19/win32-packages/mariadb-10.0.19-win32.msi/from/http%3A//mirror2.hs-esslingen.de/mariadb</maria322>
    17. <maria641>https://downloads.mariadb.org/f/mariadb-10.1.12/winx64-packages/mariadb-10.1.12-winx64.msi/from/http%3A//mirrors.n-ix.net/mariadb/?serve</maria641>
    18. <maria642>https://downloads.mariadb.org/interstitial/mariadb-10.0.19/winx64-packages/mariadb-10.0.19-winx64.msi/from/http%3A//mirror2.hs-esslingen.de/mariadb</maria642>
    19. <maria_v>5.5</maria_v>
    20. <mysql321>http://dev.mysql.com/get/Downloads/MySQLInstaller/mysql-installer-community-5.6.14.0.msi/from/http://cdn.mysql.com/</mysql321>
    21. <mysql322>http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQLInstaller/mysql-installer-community-5.6.14.0.msi</mysql322>
    22. <mysql641>http://dev.mysql.com/get/Downloads/MySQLInstaller/mysql-installer-community-5.6.14.0.msi/from/http://cdn.mysql.com/</mysql641>
    23. <mysql642>http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQLInstaller/mysql-installer-community-5.6.14.0.msi</mysql642>
    24. <mysql_v>5.6</mysql_v>
    25. <odbc321>http://sourceforge.net/projects/bcpos/files/mysql-connector-odbc-3.51.27-win32.msi/download</odbc321>
    26. <odbc322>http://sourceforge.net/projects/bcpos/files/mysql-connector-odbc-3.51.27-win32.msi/download</odbc322>
    27. <odbc641>http://sourceforge.net/projects/bcpos/files/mysql-connector-odbc-3.51.27-win32.msi/download</odbc641>
    28. <odbc642>http://sourceforge.net/projects/bcpos/files/mysql-connector-odbc-3.51.27-win32.msi/download</odbc642>
    29. <visual1>http://download.microsoft.com/download/5/B/C/5BC5DBB3-652D-4DCE-B14A-475AB85EEF6E/vcredist_x86.exe</visual1>
    30. <visual2>http://microsoft-visual-c-2010-redistributable-package-x86.softonic.de/download#downloading</visual2>
    31. <amtu>http://downloads.sourceforge.net/project/amtu/amtu/1.0.9/amtu-win32-1.0.9-jre1.6.0-bundled.exe</amtu>
    32. </Downloadpfade>


    Ich gehe mit einem XML-Reader alles durch und schaue, ob ich eine Antwort bekomme. Bekomme ich sie, wird ein grün hinterlegtes Item in der ListView hinzugefügt. Wenn ich keine bekomme, greift das Try-Catch und fügt ebenso ein rot hinterlegtes Item hinzu. Aus dem oben genanten Link kann ich nichts downloaden, müsste also in das Try-Catch springen, tut es aber nicht.
    Lustigerweiße bekomme ich selbst bei der Zeile "5.6" eine positive Antwort ?(
    Ich hoffe, es ist ein wenig verständlicher jetzt.

    Grüße,
    KingLM97
    Wie ich bereits geschrieben habe: Wirf mal bitte das Try Catch weg.

    Was meinste du mit der Aussage, dass du bei 5.6 einen positiven Wert bekommst? Wird dir der eintrag grün eingefügt?

    Wenn ich eine ungültige Web-Adresse über WebRequest.Create(url) eingebe, dann kommt gleich mal eine UriFormatException daher.

    Probier mal folgendes: Zerleg dir die Funktion in so viele einzelne Teil-Funktionen wie möglich. So etwa das Downloaden der XML, das Erzeugen der WebRequests und der Responses und so weiter. Dann kannst du auch besser debuggen.
    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
    Die Links auf den Bildern müssten rot sein, genauso wie "5.6" und "10".



    Ich bekomme keine UriFormatException.
    Und egal ob mit oder ohne TryCatch, es bleibt alles grün.
    Zerlegen würde ich das alles aktuell nur sehr ungern, da ich dann alles neuschreiben dürfte. Ich hatte vor, das später nochmal neu zu schreiben, ist nämlich alter Code bzw ein altes Projekt von mir :)

    @Bluespide
    Nö, bei mir irgendwie nicht ?(
    @TE: Oh man...wenn ich den Code jetzt ned selber noch mal (in C#) nachprogrammiert hätte, wär ich warscheinlich auch ned drauf gekommen. Schau dir mal in deinem Code die Zeile #13 an:

    VB.NET-Quellcode

    1. Dim anfrage As WebRequest = DirectCast(WebRequest.Create(strURL), WebRequest)


    Wo verwendest du die Variable strURL noch? Bzw schau dir mal die Variable im Debugger in jedem Schleifendurchgang an.

    Lg Radinator

    Edit: An alle! Bitte die Antwort nicht spoilern! Er soll selber drauf kommen.
    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
    Oh man...
    Immer diese Kleinigkeiten :D

    Quellcode

    1. ​reader.value
    ist das richtige, und nicht immer der gleiche Link

    Quellcode

    1. strURL
    .
    Ich bin das beim Debuggen schon so oft durchgegangen, bin aber immer davon ausgegangen dass es nicht an der URL liegt :D

    Vielen Dank :)