Tipps und Tricks rund um .NET und Visual Studio

ASP.NET Web API: Fortschritt ermitteln
Kommentare

Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer teilen in der Kolumne „.NETversum“ ihr Expertenwissen rund um .NET-Tools und WPF mit.

Zum Ermitteln des Fortschritts eines Upload- bzw. Downloadvorgangs bietet ASP.NET Web API einen ProgressMessageHandler (Listing 1). Wie alle anderen MessageHandler auch, ist dieser mit allen anderen zu verwendenden Handlern zu verketten, wobei sich am Ende dieser Kette ein HttpClientHandler befinden muss. Nachdem er sie erzeugt hat, übergibt der Entwickler diese MessageHandler-Kette an den Konstruktor von HttpClient.

Der Eigenschaft HttpReceiveProgress von ProgressMessageHandler weist er zusätzlich eine Methode zu, die laufend über den Fortschritt eines Downloads informiert werden soll (Listing 2). Diese Methode erhält bei jedem Aufruf ein Argument vom Typ HttpProgressEventArgs, das Zugriff auf Informationen, welche den aktuellen Fortschritt repräsentieren, gewährt. Die Eigenschaft ProgressPercentage enthält zum Beispiel den Grad der Fertigstellung in Prozent. Im betrachteten Fall wird dieser Wert ausgegeben, sofern er sich seit dem letzten Aufruf der Benachrichtigungsmethode geändert hat.

Um sich über den Fortschritt eines Uploadvorgangs informieren zu lassen, geht der Entwickler analog vor. Allerdings verwendet er hierzu die Eigenschaft HttpSendProgress anstelle von HttpReceiveProgress.

static async void DownloadDemo()
{
  var progressMessageHandler = new ProgressMessageHandler()
  {
    InnerHandler = new HttpClientHandler()
  };

  progressMessageHandler.HttpReceiveProgress += 
                  progressMessageHandler_HttpReceiveProgress;
  
  HttpClient client = new HttpClient(progressMessageHandler);

  var response = await client.GetAsync("http://localhost:1307/api/Bilder");
  var stream = await response.Content.ReadAsStreamAsync();

  Console.WriteLine("Habe Stream erhalten!");
  long bytes = 0;

  using (FileStream fs = 
                 new FileStream(@"c:tempdownload.dat", FileMode.Create))
  {
    int b;
    while ((b = stream.ReadByte()) != -1)
    {
      fs.WriteByte((byte)b);
      bytes++;
      if (bytes % (200 * 1024) == 0)
      {
        Console.WriteLine(bytes / 1024 + " KB gelesen ...");
      }
    }
  }
  Console.WriteLine("Fertig gelesen");

}
static int progress = -1;
[...]
static void progressMessageHandler_HttpReceiveProgress(
                                 object sender, HttpProgressEventArgs e)
{
  if (progress == e.ProgressPercentage) return;
  Console.WriteLine(e.ProgressPercentage + "% heruntergeladen");
  progress = e.ProgressPercentage;
}
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -