Prüfen, ob URL gültig/erreichbar

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

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von TheChosen0ne.

    Prüfen, ob URL gültig/erreichbar

    Hey zusammen.
    Ich schreibe momentan ein Programm welches mir bei meiner Musikverwaltung hilft.

    Eine Funktion ist, dass ich eine "Musik-Cover-URL" in einer Textbox angeben kann; Das Bild der URL wird dann in einer Picturebox angezeigt. So weit so gut.
    Allerdings kommt es zu Problemen, wenn der angegebene Link garkein Bild ist oder überhaupt eine gültige Internetadresse. Zum Prüfen des angegebenen Links habe ich folgende Hilfsmethode aus dem Internet verwendet:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Function URLOk(ByVal Tx As String) As Boolean
    2. Try
    3. Dim hostInfo As System.Net.IPHostEntry _
    4. = System.Net.Dns.GetHostEntry(Tx)
    5. Return True
    6. Catch
    7. Return False
    8. End Try
    9. End Function



    Habe einige Links ausgetestet und es schien zunächst auch gut zu funktionieren. In der Verwendung musste ich dann leider feststellen, dass teilweise auch funktionierende Links als "nicht gültig" abgestempelt werden.
    Test-Beispiel: cdn.djhardwell.com/uploads/lar…mall_fdb3ecf6bbb07818.jpg

    Ich hoffe ihr könnt mir helfen.
    MfG

    EDIT: Es wird offenbar nur die Serververbindung geprüft! Z.B. wird bei "www.youtube.com" true wiedergegeben, bei "www.youtube.com/watch[...]" & sogar schon bei "www.youtube.com/" wird false ausgespuckt. Wie kann ich das beheben?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „TheChosen0ne“ ()

    Naja. DNS kennt logischerweise nur die Domain. "www.vb-paradise.de" ist eine Domain. "www.vb-paradise.de/" ist keine. Bzw. gibt es keine Domain, die "de/" heißt.
    Ich traue mich sogar, zu sagen, dass Du das selbst festgestellt hättest, würdest Du nicht alle Exceptions fangen, sondern nur die, die bei nicht existierenden Domains auftritt. Bei ungültigen Werten tritt, so vermute ich, eine ArgumentException auf, was bei dir auch dazu führt, dass False zurückgegeben wird. Also kommentiere erst mal das Try-Catch aus und guck dir an, was bei nicht existierenden Domains passiert und was bei ungültigen Werten passiert.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @TheChosen0ne Da gibt es noch eine URI-Klasse, die kannst Du ja mal befragen:

    VB.NET-Quellcode

    1. Dim uri = New Uri("http://www.youtube.com")
    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!

    Niko Ortner schrieb:

    Naja. DNS kennt logischerweise nur die Domain. "www.vb-paradise.de" ist eine Domain. "www.vb-paradise.de/" ist keine. Bzw. gibt es keine Domain, die "de/" heißt.
    Ich traue mich sogar, zu sagen, dass Du das selbst festgestellt hättest, würdest Du nicht alle Exceptions fangen, sondern nur die, die bei nicht existierenden Domains auftritt. Bei ungültigen Werten tritt, so vermute ich, eine ArgumentException auf, was bei dir auch dazu führt, dass False zurückgegeben wird. Also kommentiere erst mal das Try-Catch aus und guck dir an, was bei nicht existierenden Domains passiert und was bei ungültigen Werten passiert.


    Wie du im Edit siehst, ist mir dies inzwischen auch aufgefallen. Ich habe das Problem folgendermaßen gelöst:
    Ich lasse den Link in die Domain umwandeln und prüfe dann, ob diese erreichbar ist. Sicher nicht die eleganteste Lösung, aber sollte dennoch klappen oder?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Function linkZuDomain(pLink As String) As String
    2. If pLink <> Nothing Then
    3. Return pLink.Split("/")(2)
    4. End If
    5. Return Nothing
    6. End Function
    7. Function URLOk(ByVal link As String) As Boolean
    8. Dim Tx As String = linkZuDomain(link)
    9. Try
    10. Dim hostInfo As System.Net.IPHostEntry _
    11. = System.Net.Dns.GetHostEntry(Tx)
    12. Return True
    13. Catch
    14. Return False
    15. End Try
    16. End Function



    Die nächste Frage wäre: Wie prüfe ich, dass es sich bei dem Link um ein Bild handelt? Da sollte es bestimmt ausreichen, den Link auf die Endung ".png" und ".jpg" zu prüfen.
    @TheChosen0ne
    Function linkZuDomain(pLink As String) As String

    Guck nochmal in den Screenshot von RodFromGermany. Da gibt's was, was du verwenden kannst, ohne mit Stringoperationen hantieren zu müssen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    TheChosen0ne schrieb:

    Die nächste Frage wäre:
    Ignoriere ich Post #3?
    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 erlidge das ganze mittels WebRequest, allerdings frage ich nur ab ob eine Url erreichbar ist.
    Spoiler anzeigen

    C#-Quellcode

    1. static bool IsUrlValid(string url, int timeout)
    2. {
    3. try {
    4. HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;
    5. request.Timeout = timeout;
    6. request.Method = "Head";
    7. using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) {
    8. int statusCode = (int)response.StatusCode;
    9. if (statusCode >= 100 && statusCode < 400)
    10. return true;
    11. }
    12. }
    13. catch (WebException ex) {
    14. if (ex.Status != WebExceptionStatus.ProtocolError) {
    15. Console.ForegroundColor = ConsoleColor.Red;
    16. Console.WriteLine(ex.Message);
    17. Console.ResetColor();
    18. }
    19. }
    20. return false;
    21. }


    Du müsstest also noch eine Abfrage einbauen die den response.ContentType prüft.

    RodFromGermany schrieb:

    @TheChosen0ne Da gibt es noch eine URI-Klasse, die kannst Du ja mal befragen:

    VB.NET-Quellcode

    1. Dim uri = New Uri("http://www.youtube.com")
    vb-paradise.de/index.php/Attac…cc5abc20f343c409fb4272039

    Tut mir leid, habe dich überlesen.

    Die URI-Klasse vereinfacht einiges. Super, Danke!
    Verstehe ich die Klassen richtig?:
    - Um zu prüfen ob der angegebene Link eine existierende Seite ist, verwende ich "isFile".
    - Die Domain bekomme ich mithilfe "Host" oder "DnsSafeHost".

    Und ich habe noch Fragen, die sich mithilfe der URI-Klasse vielleicht garnicht lösen lassen:
    - Wenn ich einen Link angebe der nicht mit "[...]://" anfängt, schmiert das Programm ab. Eingaben wie "youtube.com" sind also nicht möglich. Ich muss hier nicht das "http://" automatisch mit anfügen lassen oder?
    - Ist es möglich, den Dateityp zu ermitteln? Wie oben erläutert sollen die zugelassenen Seiten nur Bilder sein.

    MfG
    @TheChosen0ne Eine automatische Vervollständigung wie beim FF gibt es da nicht, der Pfad muss schon korrekt sein. Allerdings kannst Du Dir die Vervollständigung selbst bauen, nimm diese Exception zu Hilfe..
    Mach einfach alle denkbaren Fälle und sieh Dir an, wie URI das auflöst.
    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!