Laden...

ASP.NET Core Web-API File download

Erstellt von thomas.at vor 2 Jahren Letzter Beitrag vor 2 Jahren 4.880 Views
T
thomas.at Themenstarter:in
111 Beiträge seit 2005
vor 2 Jahren
ASP.NET Core Web-API File download

Hallo

Ich habe eine ASP.NET Core Web-API die ich auf Version 6 umstellen soll. In dieser ist in einem Controller folgende Methode:


    [HttpGet]
    public async Task<IActionResult> GetDocument(string datei)
    {
      if (!ModelState.IsValid)
        return BadRequest(ModelState);
      try
      {
        WebClient client = new();
        client.Credentials = CredentialCache.DefaultNetworkCredentials;
        Task<byte[]> t = client.DownloadDataTaskAsync(new Uri(datei));
        await t;
        var file = t.Result;
        return File(
          file,
          new ContentTypes().GetContentType(datei),
          "_File" + Path.GetExtension(datei).ToLowerInvariant());
      }
      catch (Exception ex)
      {
        return BadRequest(ex.GetAll());
      }
    }

Der String für die Datei sieht wie folgt aus:


 \\Server\Share\Directory\Filename

Jetzt meldet mir das System. dass "WebClient" deprecated ist und ich "HttpClient" statt dessen verwenden soll.
Nur erlaubt mir dieser nicht, eine Uri im Format "file://...." zu verwenden. Auch meine Recherche im Internet
hat mir keine Erkentniss darüber gebracht, wie ich dieses Problem lösen kann. Vielleicht habe ich nach den falschen Stichwörtern gesucht.
Kann mir vielleicht einer von Euch hierzu einen Tipp geben?

mfG
Thomas

D
152 Beiträge seit 2013
vor 2 Jahren

Sieht für mich wie ein Netzwerkpfad aus, also kann man https://docs.microsoft.com/de-de/dotnet/api/system.io.file.readallbytes?view=net-6.0 nehmen und braucht kein HttpClient.

Schaue Dir auch FileStreamResult an
https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.filestreamresult?view=aspnetcore-6.0 besser
https://www.aspsnippets.com/Articles/FileStreamResult-Net-Core-Example-Using-FileStreamResult-in-ASPNet-Core-MVC.aspx

Ohne eine Prüfung (Berechtigung, ...) eine Datei zurückzugeben ist vielleicht keine so gute Idee.

16.842 Beiträge seit 2008
vor 2 Jahren

Jetzt meldet mir das System. dass "WebClient" deprecated ist und ich "HttpClient" statt dessen verwenden soll.

Ja, ist ungefähr seit 7-8 Jahren so; aber das Vorgehen hier ist eh nicht gut.
Du lädst die gesamte Datei in den dynamischen Speicher und gibst dann die Inhalte zurück.
Damit wird das System belastet und im Endeffekt ist das auch ein DoS-Risiko - paar Requests und der RAM ist voll und die App stürzt ab.

Besser, und wird seit den Beginnen von ASP.NET an gepredigt: Streaming verwenden.
Erst neulich gabs dazu auch wieder ein Tweet von einem der ASP.NET Core Architekten (https://twitter.com/davidfowl/status/1484985445423271937) und auch wie man es besser macht (https://twitter.com/davidfowl/status/1484985437957410821).

Auch das t.Result ist alles andere als eine gute Idee - das ist völlig falscher async/await Code (wenigstens wurde vorher awaited, sodass es kein Deadlock Risiko gibt).
Im Endeffekt muss die gesamte Methode neu geschrieben werden, um es richtig zu machen.

T
thomas.at Themenstarter:in
111 Beiträge seit 2005
vor 2 Jahren
[gelöst] ASP.NET Core Web-API File download

Hallo

Danke an alle. Ich habe das jetzt über FileStreamResult, wie david.m im zweiten Link erwähnt hat, gelöst.

P.S.
Natürlich gibt es Prüfungen bezüglich Berechtigungen, ob das File überhaupt existiert usw. Diese habe ich aber nicht mit angegeben, da sie ja für die Frage nicht relavant sind.

mfG
Thomas