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
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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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