Bereitstellen dynamischer Dateien mit Blazor in ASP.NET

Eine der vielen großartigen Funktionen von Frameworks wie Blazor und ASP.NET ( auf dem es ausgeführt wird) ist die Fähigkeit, dynamische Inhalte an jedem Endpunkt bereitzustellen, den Ihre Anwendung benötigt. Wenn Sie Downloads generierter Dateien bereitstellen möchten, ist dies mit ein wenig Konfiguration ganz einfach.

Warum dynamische Dateien bereitstellen ?

Grundsätzlich haben Sie als Webserver zwei Möglichkeiten: Antworten Sie auf eine Anfrage mit statischem Inhalt, wie einer HTML-Seite oder einer JPG-Datei, oder generieren Sie eine benutzerdefinierte Antwort zum Senden an den Benutzer. Blazor läuft auf ASP.NET, sodass der integrierte HTTP-Server eine breite Palette von Optionen unterstützt und eine große Flexibilität ermöglicht.

Sie möchten beispielsweise eine JSON-Datei unter /images/pathname hosten. json. Dies muss keine wörtliche Datei auf der Festplatte sein; Der Server kann diese Anfrage interpretieren und mit jeder Art von Inhalt antworten, einschließlich etwas Unerwartetem wie einer PNG-Datei. Sie können auf diese Anfrage antworten, indem Sie einige Ergebnisse von einer API abrufen, eine Antwort erstellen und die Zeichenfolge an den Benutzer zurücksenden.

Oder vielleicht möchten Sie die eigentliche Datei im Handumdrehen generieren. Es gibt beispielsweise viele Grafikbibliotheken, die zum Zeichnen benutzerdefinierter Bilder verwendet werden. Sie können eines davon verwenden, um ein Bild zu generieren und auf die Benutzeranfrage mit den Daten zu antworten, alles im Speicher.

Im letzteren Fall kann es sinnvoll sein, die Antwort zwischenzuspeichern, indem Sie sie auf der Festplatte speichern und meistens mit einer echten Datei antworten. Dies kann bei ressourcenintensiven Dateigenerationen nützlich sein, die sich nicht so oft ändern.

Einrichten

Das Bereitstellen von Dateien wie dieser ist integriert und ziemlich einfach. Sie müssen eine neue Razor-Seite erstellen, auf der Blazor ausgeführt wird. Klicken Sie dazu mit der rechten Maustaste in Visual Studio und wählen Sie Hinzufügen > Razor-Seite.

Werbung

Dadurch werden zwei Dateien erstellt, die in der Hierarchie miteinander verknüpft sind: Name.cshtml, die die HTML-Seite der Dinge behandelt, und Name.cshtml.cs, die das Modell und den eigentlichen Code behandelt. Da es sich hierbei nicht um eine tatsächliche Webseite, sondern um eine Datei handelt, können Sie die erste größtenteils ignorieren.

Sie müssen jedoch das @page-Attribut so festlegen, dass es mit where übereinstimmt Sie möchten, dass diese Datei gehostet wird. Sie werden wahrscheinlich einige Platzhalter verwenden wollen, was Sie mit Klammern tun.

In der Datei Name.cshtml.cs sehen Sie tatsächlichen Code, der PageModel erweitert. Die Hauptfunktion hier ist OnGet(), die Sie wahrscheinlich in OnGetAsync() ändern möchten, wenn Sie eine asynchrone Verarbeitung durchführen.

Sie haben drei Hauptoptionen dieser Funktion. Zuerst wird eine PhysicalFile zurückgegeben, die buchstäblich eine Datei auf der Festplatte mit einem angegebenen Pfad liest und sie mit einem Typ an den Benutzer sendet, optional mit einem anderen Download-Namen als dem tatsächlichen Pfad.

Während Sie wahrscheinlich hier sind, um etwas dynamisch zu generieren, kann dies für das Caching sehr nützlich sein. Wenn Ihre Verarbeitungsfunktion das Ergebnis in einer Datei speichert, können Sie prüfen, ob diese Datei vorhanden ist, bevor Sie sie erneut verarbeiten. Wenn ja, geben Sie einfach die zwischengespeicherte Antwort zurück.

Werbung

Die nächste Option ist die Rückgabe einer virtuellen Datei mit einem Byte-Array. Dies ist, was Sie für die meisten Anwendungen verwenden möchten, da es vollständig im Speicher arbeitet und sehr schnell sein sollte.

Je nachdem, welche Codierung Sie verwenden möchten, möchten Sie möglicherweise einen String in ein Byte-Array umzuwandeln, indem die Encoding-Hilfsklasse verwendet wird.

Encoding.UTF8.GetBytes(string);

Schließlich können Sie eine Inhaltszeichenfolge direkt zurückgeben, was Sie auch tun sollten verwenden, wenn Sie dem Benutzer den Inhalt anzeigen möchten, anstatt einen Download in seinem Browser auszulösen.

Es gibt andere Optionen als diese drei, aber der Rest besteht darin, mit Statuscodes zu antworten und umzuleiten , nicht autorisierte Antworten und das Rendern der Seite selbst.

Dateien basierend auf Routen bereitstellen & Parameter

All dies ist natürlich nicht sinnvoll, wenn Sie nicht auf Anfragen basierend auf Benutzereingaben reagieren können. Die beiden Eingabeformen befinden sich beide in der URL: Routingparameter und URL-Parameter. Routing-Parameter sind das, was Sie mit Platzhaltern auf der Seite selbst angegeben haben, und sind der tatsächliche Pfad zur Datei. URL-Parameter sind optional.

Dies herauszufinden kann etwas mühsam sein, aber zum Glück haben Sie einen Debugger an Ihrer Seite, sodass Sie in OnGetAsync() einen Haltepunkt setzen und den gesamten lokalen Variablenbaum anzeigen können .

Werbung

Sie finden unter this.PageContext.RouteData ein RouteValueDictionary<string, object> die alle Routen speichert. Beachten Sie, dass dies die Seitenroute selbst einschließt. Wenn Sie also /Download/{param} als Route verwendet haben, ist der Parameter die zweite Option.

Die Parameter lassen sich am besten abrufen, indem Sie sie nachschlagen nach Schlüssel:

Ähnlich sind auch die Abfrageparameter verfügbar , allerdings von einem anderen Objekt. Sie müssen auf HttpContext.Request.Query zugreifen, ein QueryValueDictionary, das die URL-Parameter enthält und ähnlich wie die Route funktioniert.

Sie können diese Parameter dann frei verwenden, um Suchvorgänge durchzuführen oder die Logik zu beeinflussen. Wenn Sie Antworten zwischenspeichern, sollten Sie jedoch sicherstellen, dass auch Ihre Cache-Bedingungen und -Lookups von diesen Parametern beeinflusst werden, da sonst Probleme mit unerwartetem Caching-Verhalten auftreten können.


Posted

in

by

Tags: