Vor Dateidownload an Seite anmelden

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

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von WhitePage.

    Vor Dateidownload an Seite anmelden

    Hallo,

    Ich habe ein kleines Download Programm geschrieben, welches mir automatisiert Dateien von einem Server lädt. Mit Webclient downloadfileasynch etc. geht das scheinbar auch sehr einfach.
    Allerdings muss man sich an dem Server anmelden. Wie kann man das nun vor Auslösen des Downloads machen, dass er sich an dem Server anmeldet? Mit Credentials hab ich da was gelesen, aber nicht so richtig umsetzen können.

    Danke für jeden Hinweis!!

    Gruß Alex.
    ==> seid .net zueinander :D <3 <==
    @Axxxxxl
    Wenn der Benutzer die Zugangsdaten für den Server selber eingeben muss empfehle ich dir die Credentials-Eigenschaft der WebClient-Klasse:

    C#-Quellcode

    1. WebClient wc = new WebClient();
    2. wc.Credentials = new NetworkCredential("username", "password");

    Falls du ein fixes Passwort in den Code schreiben möchtest, musst du bedenken, dass es leichtes Spiel ist dein fertiges Programm decompilen und die Zugangsdaten aus deinem Code zu extrahieren.

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom

    Switcherlapp97 schrieb:

    @Axxxxxl
    Wenn der Benutzer die Zugangsdaten für den Server selber eingeben muss empfehle ich dir die Credentials-Eigenschaft der WebClient-Klasse:

    C#-Quellcode

    1. WebClient wc = new WebClient();
    2. wc.Credentials = new NetworkCredential("username", "password");

    Falls du ein fixes Passwort in den Code schreiben möchtest, musst du bedenken, dass es leichtes Spiel ist dein fertiges Programm decompilen und die Zugangsdaten aus deinem Code zu extrahieren.

    Gruß
    Switcherlapp97

    So einfach ist das nicht,
    wenn du dich z.B. in einem Forum authentifizieren musst um etwas von dort herunterzuladen musst du dich einloggen und das geht nicht mit den einfachen Credentials. Du musst wie ich schon sagte ein HTTP WebRequest machen und dich erstmal einloggen, und mit der Response Session dann ein Request auf die Datei die du runterladen möchtest.
    @Markus Jacobs
    Aus dem Startpost ist leider nicht ersichtlich, um was für eine Anwendung es sich handelt. Falls er einen einfachen FTP Download programmieren will, ist es nicht notwendig eine Web Request zu verwenden. Dafür würden Credentials reichen :D Ansonsten muss der TE wie du bereits gepostet hast eine WebRequest verwenden

    Vielleicht könnte der TE ein bisschen genauer schildern, um was es sich bei seinem Problem genau handelt.

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom
    Danke für die Tipps.
    Also es ist tatsächlich eine Webseite auf der man sich anmelden muss. Die Dateien haben aber alle den gleichen Namen nur mit aufsteigender Nummer. Dafür habe ich mir eine Schleife geschrieben von wo ich mit dem Download starten will und dann gehts los.

    Also Webrequest, da muss ich mich mal schlau machen. Mal sehen ob ich es hinbekomme.
    ==> seid .net zueinander :D <3 <==
    Das geht leider nicht, da es eine firmeninterne Seite ist, sorry. Aber wenn man sich dort einloggt erfolgt das nicht per Webformular sondern es poppt ein ganz normaler Username / Passwort Dialog auf und erst nach dem Anmelden ist man dann im gewünschten Verzeichnis.

    Oder reicht es auch wenn ich mich Browser auf der Seite anmelde und dann erst das Downloadprogramm starte?
    ==> seid .net zueinander :D <3 <==

    Axxxxxl schrieb:

    Oder reicht es auch wenn ich mich Browser auf der Seite anmelde und dann erst das Downloadprogramm starte?



    Nee, das wird nicht funktionieren, dein Programm braucht schon ne Session mit der man eingeloggt ist... die ist leider nicht systemweit gesetzt... also glaube ich zumindest... :D
    Dafür musst halt wie gesagt die WebRequest machen damit du halt die Session bekommst.... Ich kenn mich damit aber auch nich so dolle aus...
    Wenns firmenintern ist kann dir da eigentlich niemand so genau helfen, weil wir halt die Struktur des Logins nicht kennen...
    Viel Glück ;)

    Axxxxxl schrieb:

    es poppt ein ganz normaler Username / Passwort Dialog auf
    "ganz normal" ist alles oder nichts.
    Wenn es ein Intranet-Server ist, frage ich mich sowieso, wieso das nicht über Single-Sign-On gelöst ist.

    "Aufpoppen" könnte zumindest auf ein Request hindeuten, der sich durch Angabe der Credentials abdecken lässt.
    Nimm ein HTTP-Trace-Tool und schau, was beim Login passiert.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    So, habe es nun probieren können. Bei diesem Server reicht das mit den

    VB.NET-Quellcode

    1. wc.Credentials = new NetworkCredential("username", "password");
    völlig aus. Es klappt!
    Zudem ist es kein Login per irgendeinem Webinterface oder Formular sonder wahrscheinlich ein normaler Verzeichnisschutz wo eben zum Login im Internet Explorer eine normale Passwortabfrage aufpoppt.

    Danke für alle Tipps!!!

    PS: Das Passwort wird in der finalen Version natürlich nicht im Code hinterlegt :) !!!

    ==> noch eine Anmerkung. Ich lasse den Download in einer "Try" Schleife durchführen. Wenn ich das bei meinem Server oben teste, ohne dass ich die Zugangsdaten mitschicke, lädt er logischerweise die Datei nicht herunter, bringt aber auch keine Fehlermeldung was nicht geklappt hat. Kann mir jemand sagen, wie ich die WebClient Fehler in "Catche" abfangen kann???
    ==> seid .net zueinander :D <3 <==

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Axxxxxl“ ()

    Axxxxxl schrieb:

    Kann mir jemand sagen, wie ich die WebClient Fehler in "Catche" abfangen kann???

    VB.NET-Quellcode

    1. Dim wc As New WebClient()
    2. Try
    3. wc.DownloadString("http://www.dieseseitegibtsleidernicht.de")
    4. Catch ex As Exception
    5. MessageBox.Show(ex.Message)
    6. End Try

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom
    @Switcherlapp97,

    das klappt soweit auch, aber da kommen eben nur Fehlermeldungen an, wenn zB kein richtiges URL Format mitgegeben wird etc.. Aber in dem oben beschriebenen Fall, wenn ich also bswp. bewusst falsche Zugangsdaten mitschicke, durchläuft er die Downloadroutine und springt dann zu

    VB.NET-Quellcode

    1. Private Sub DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles myWebClient.DownloadFileCompleted
    so als wenn es erfolgreich gewesen wäre. Die Datei hat aber logischerweise 0 Byte.

    Vielleich können wir das noch lösen?!
    Und prüft dieser Webclient beim Download eigentlich, ob es die lokale Datei schon gibt? Da ich nicht davon ausgehe, müsste ich dann noch was schreiben, damit das vor Beginn des Downloads geprüft wird oder?
    ==> seid .net zueinander :D <3 <==
    @Axxxxxl
    Ich würde im DownloadFileCompleted überpüfen, ob e.Error Nothing ist. Wenn ja war der Downloadvorgang erfolgreich, sonst kannst du e.Error.Message als MessageBox aufpoppen lassen.

    VB.NET-Quellcode

    1. If (e.Error Is Nothing) Then
    2. MessageBox.Show("Erfolgreich")
    3. Else
    4. MessageBox.Show(e.Error.Message)
    5. End If

    Übrig bleibt noch die Dateileiche, die mit 0 Bytes auf dem Rechner erstellt wird. Diese könntest du gegebenfalls noch entfernen ;)

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom
    Ok, passt soweit. Noch eine abschließende Frage,
    um herauszubekommen, welche Login Methode bei einem Server genutzt wird, wenn dieser per Popup Feld nach Benutzerdaten fragt, gibt es doch sicher Plugins für den Firefox. Hat da jemand Erfahrung damit oder kann mir eines empfehlen?

    Dankeee.

    PS: Schlaaaaaand, Schlaaaaaaahaaaaaannnndddd :thumbsup:
    ==> seid .net zueinander :D <3 <==
    So, habe jetzt noch ne Frage zum Download selbst, insbesondere mehreren Dateien hintereinander. Ich gebe in meiner Form die Startzahl und Endzahl der zu ladenden Dateien bekannt.
    Dann habe ich es in eine Schleife gepackt. Allerdings lädt er nur die erste Datei da er dann ja durch "FileComplete" Eigenschaft zum Ende kommt. Er missachtet also mein "next i". Erkennt da jemand meinen Fehler? ?(

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim i As Integer
    3. Me.Text = "Download wird gestartet..."
    4. Try
    5. i = filestart
    6. For i = i To fileend
    7. lblstatus.Text = "Datei " & i & " wird geladen"
    8. myWebClient.Credentials = New NetworkCredential(txt_username.Text, txt_pw.Text)
    9. myWebClient.DownloadFileAsync(New Uri("http://www.test.de/datei" & i & ".txt"), "C:\Temp\datei" & i & ".txt")
    10. Next i
    11. Catch ex As Exception
    12. MessageBox.Show(ex.Message)
    13. Label1.Text = "Download fehlgeschlagen!"
    14. myWebClient.Dispose()
    15. End Try
    16. End Sub
    17. Private Sub DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles myWebClient.DownloadFileCompleted
    18. If (e.Error Is Nothing) Then
    19. Label1.Text = "Download erfolgreich abgeschlossen"
    20. myWebClient.Dispose()
    21. Else
    22. MessageBox.Show(e.Error.Message)
    23. myWebClient.Dispose()
    24. End If
    25. End Sub
    ==> seid .net zueinander :D <3 <==