Laden...

C# Alternative Fallback-Adressen für WebClient

Erstellt von Marabunta vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.726 Views
M
Marabunta Themenstarter:in
7 Beiträge seit 2014
vor 7 Jahren
C# Alternative Fallback-Adressen für WebClient

Hallo,

ich habe eine Datei, die über einen langen Weg eine Zieldatei beschafft.
Damit kann ich mein Progamm weitgehend aktuell halten, klappt auch ganz gut soweit.
Was mir noch fehlt ist die Möglichkeit, die Zieladresse zu überprüfen und ggf. eine oder mehrere alternative Adressen mitzugeben wegen Ausfällen usw.

Wie kann ich das erreichen?

using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Cache;

namespace Updater
{
  internal class Updater
  {
    private static void Main(string[] args)
    {
      HttpWebRequest.DefaultCachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache);
      WebClient webClient = new WebClient();
      string address1 = "http://seite.de/link.txt"; //Datei enthält nur eine ZielIP

      string ip = new StreamReader(webClient.OpenRead(address1)).ReadToEnd();
      
      //Das ist eine weitere Textdatei mit dem 2. Teil der Adresse:
      string address2 = "http://" + ip + "/nextcloud/index.php/s/xxxxxxxx/download";  
      string str7 = webClient.DownloadString(address2);

     //Ziel Datei
      string address3 = "http://" + ip + str7;
      string fileName = str4;
      webClient.DownloadFile(address3, fileName);

    }
  }
}

D
985 Beiträge seit 2014
vor 7 Jahren

Du willst für den gleichen Vorgang alternative Strategien verfolgen können.

Erstelle dir ein Interface was den Kern der Strategie beschreibt und implementiere x davon. Wenn du die in eine Liste packst probierst du die Einträge in der Liste einen nach dem anderen durch bis du Erfolg hattest oder keine Einträge mehr in der Liste sind.

Hier könnte man das Interface IDownloadFile nennen, was eine Methode hat, die den Dateinamen zurückgibt unter der die Datei auf der Platte abgelegt wurde.

W
198 Beiträge seit 2008
vor 7 Jahren

Pack den relevanten Teil in einen try-catch Block. Kombiniert mit einer ForEach-Schleife probierts Du dann die alternativen Adressen einfach durch, bis es entweder geklappt hat oder eben das Ende der 'Adressliste' erreicht ist.

Deine Datei 'link.txt' sollte dann mehrere Adressen enthalten (einfech eine Adresse pro Zeile) und z.B. via String.Split ermittelst Du dann aus dieser Liste der der Adressen die einzelnen Zeilen, die jweiels eine Adresse darstellen.

etwa so:

string address1 = "http://seite.de/link.txt"; //Datei enthält nur eine ZielIP
string[] ips = new StreamReader(webClient.OpenRead(address1)).ReadToEnd().Split(new char[] {'\r', '\n'}, StringSplitOptions.RemoveEmptyEntrys);

foreach (string ip in ips)
{
      try {
           //Das ist eine weitere Textdatei mit dem 2. Teil der Adresse:
           string address2 = "http://" + ip + "/nextcloud/index.php/s/xxxxxxxx/download";  
           string str7 = webClient.DownloadString(address2);

          //Ziel Datei
          string address3 = "http://" + ip + str7;
          string fileName = str4;
          webClient.DownloadFile(address3, fileName); 
          // hier prüfen, ob die Datei i.O. ist....
          break; }
     catch {
          // hier ggf. loggen, dass die ADresse nicht funktioniert hat...}
}

Um das ganze Konstrukt herum gehört natürlich noch eine vernünftige Fehlerprüfung - auch der Download der Datei link.txt kann ja scheitern...

W
955 Beiträge seit 2010
vor 7 Jahren

Pack den relevanten Teil in einen try-catch Block. Kombiniert mit einer ForEach-Schleife probierts Du dann die alternativen Adressen einfach durch... Besser wäre natürlich diese als Tasks zum implementieren und mit Task.WhenAny die erste erhaltene Datei zu verwenden.