Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Note
Dies ist nicht die neueste Version dieses Artikels. Die aktuelle Version finden Sie in der .NET 10-Version dieses Artikels.
Warning
Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie in der .NET- und .NET Core-Supportrichtlinie. Die aktuelle Version finden Sie in der .NET 10-Version dieses Artikels.
Erfahren Sie, wie Sie statische Dateien in ASP.NET Core Apps mithilfe von Map Static Assets-Endpunktkonventionen oder statischer Datei-Middleware bereitstellen, sichern und optimieren. Statische Dateien, auch als statische Ressourcen bezeichnet, werden nicht dynamisch generiert und direkt an Clients bereitgestellt, einschließlich HTML, CSS, Bilder und JavaScript.
Informationen zu statischen Blazor-Dateien, die die Informationen in diesem Artikel ergänzen oder ersetzen, finden Sie unter Statische Blazor-Dateien in ASP.NET Core.
Rufen Sie MapStaticAssets auf, um die statische Dateibehandlung in ASP.NET Core zu aktivieren.
Speichern Sie statische Dateien standardmäßig im Webstammverzeichnis des Projekts. Das Standardverzeichnis ist {CONTENT ROOT}/wwwroot, wobei der {CONTENT ROOT} Platzhalter der Inhaltsstamm der App ist. Nur Dateien im wwwroot Ordner können adressierbar sein, sodass Sie sich keine Gedanken über den Rest Ihres Codes machen müssen.
Nur Dateien mit bestimmten Dateierweiterungen, die unterstützten Medientypen zugeordnet sind, werden als statische Webressourcen behandelt.
Statische Webressourcen werden zur Erstellungszeit erkannt und mithilfe eines inhaltsbasierten Fingerabdrucks optimiert, um die Wiederverwendung alter Dateien zu verhindern. Ressourcen werden auch komprimiert , um die Bereitstellungszeit von Ressourcen zu reduzieren.
Zur Laufzeit werden die ermittelten statischen Webressourcen als Endpunkte mit angewendeten HTTP-Headern verfügbar gemacht, z. B. Cache-Header und Content-Type-Header. Ein Objekt wird einmal bereitgestellt, bis sich die Datei ändert oder der Browser den Cache löscht. Die Kopfzeilen ETag, Last-Modified und Content-Type werden festgelegt. Der Browser wird daran gehindert, veraltete Ressourcen zu verwenden, nachdem eine App aktualisiert wurde.
Die Bereitstellung statischer Ressourcen basiert auf dem Endpunktrouting, sodass sie mit anderen endpunktfähigen Features wie autorisierung funktioniert. Sie ist für alle UI-Frameworks geeignet, einschließlich Blazor, Razor Pages und MVC.
Statische Karten-Assets bieten die folgenden Vorteile:
- Komprimierung zur Buildzeit für alle Ressourcen in der App, einschließlich JavaScript (JS) und Stylesheets, jedoch ohne Bild- und Schriftartressourcen, die bereits komprimiert sind.
Gzip (
Content-Encoding: gz) Komprimierung wird während der Entwicklung verwendet. Gzip und Brotli (Content-Encoding: br) Komprimierung werden beide während der Veröffentlichung verwendet. -
Fingerabdrücke für alle Ressourcen zur Buildzeit mit einer Base64-codierten Zeichenfolge des SHA-256-Hashes jedes Dateiinhalts. Dadurch wird verhindert, dass eine alte Version einer Datei erneut verwendet wird, auch wenn die alte Datei zwischengespeichert wird. Fingerabdrücke werden mithilfe der
immutable-Direktivezwischengespeichert, was dazu führt, dass der Browser die Ressource nie erneut anfordert, bis sie geändert wird. Für Browser, die dieimmutable-Direktive nicht unterstützen, wird einemax-ageDirektive hinzugefügt.- Selbst wenn eine Ressource nicht mit einem Fingerabdruck versehen ist, werden inhaltsbasierte
ETagsfür jede statische Ressource mithilfe des Fingerabdruckhashes der Datei alsETag-Wert generiert. Dadurch wird sichergestellt, dass der Browser nur eine Datei herunterlädt, wenn sich der Inhalt ändert (oder die Datei zum ersten Mal heruntergeladen wird). - Intern ordnet das Framework physische Objekte ihren Fingerabdrücken zu, sodass die App:
- Suchen Sie automatisch generierte Ressourcen, z. B. ein auf Razor-Komponenten bezogenes CSS für das Blazor-CSS-Isolationsfeature und JS-Ressourcen, die durch JS-Importzuordnungen beschrieben werden.
- Generieren Sie Link-Tags im
<head>-Inhalt der Seite, um Ressourcen vorab zu laden.
- Selbst wenn eine Ressource nicht mit einem Fingerabdruck versehen ist, werden inhaltsbasierte
Statische Assets einer Karte bieten keine Funktionen zur Minifizierung oder andere Dateitransformationen. Die Minimierung wird in der Regel durch benutzerdefinierten Code oder Tools von Drittanbietern behandelt.
Note
MapStaticAssets stellt Standarddokumente nicht selbst bereit. Um Standarddokumente zu bedienen, rufen Sie UseDefaultFiles gefolgt von UseStaticFiles. Weitere Informationen finden Sie im Abschnitt " Standarddokumente bereitstellen ".
Rufen Sie UseStaticFiles auf, um die statische Dateibehandlung in ASP.NET Core zu aktivieren.
Speichern Sie statische Dateien standardmäßig im Webstammverzeichnis des Projekts. Das Standardverzeichnis ist {CONTENT ROOT}/wwwroot, wobei der {CONTENT ROOT} Platzhalter der Inhaltsstamm der App ist. Nur Dateien im wwwroot Ordner können adressierbar sein, sodass Sie sich keine Gedanken über den Rest Ihres Codes machen müssen.
Zur Laufzeit werden statische Webressourcen von der Middleware für statische Dateien zurückgegeben, wenn sie mit Modifikation der Ressource und angewendeten Inhaltstyp-Headern angefordert werden. Die Kopfzeilen ETag, Last-Modified und Content-Type werden festgelegt.
Die Middleware für statische Dateien ermöglicht die Bereitstellung statischer Dateien und wird von einer App verwendet, wenn UseStaticFiles in der Anforderungsverarbeitungspipeline der App aufgerufen wird. Dateien werden von dem in IWebHostEnvironment.WebRootPath oder WebRootFileProvider angegebenen Pfad bereitgestellt. Standardmäßig wird der Webstammordner verwendet, in der Regel wwwroot.
Sie können auch statische Webressourcen aus referenzierten Projekten und Paketen bereitstellen.
Ändern des Webstammverzeichnisses
Verwenden Sie die UseWebRoot Methode, um den Webstamm zu ändern. Weitere Informationen finden Sie unter ASP.NET Core Fundamentals Overview.
Verhindern Sie die Veröffentlichung von Dateien in wwwroot, indem Sie das <Content> project-Element in der Projektdatei verwenden. Im folgenden Beispiel wird verhindert, dass Inhalte in wwwroot/local und ihren Unterverzeichnissen veröffentlicht werden:
<ItemGroup>
<Content Update="wwwroot\local\**\*.*" CopyToPublishDirectory="Never" />
</ItemGroup>
Die Methode CreateBuilder legt das Inhaltsstammverzeichnis auf das aktuelle Verzeichnis fest:
var builder = WebApplication.CreateBuilder(args);
Die Methode CreateDefaultBuilder legt das Inhaltsstammverzeichnis auf das aktuelle Verzeichnis fest:
Host.CreateDefaultBuilder(args)
Rufen Sie in der Anforderungsverarbeitungspipeline nach dem Aufruf UseHttpsRedirectionauf MapStaticAssets , um die Bereitstellung statischer Dateien aus dem Webstamm der App zu aktivieren:
app.MapStaticAssets();
Rufen Sie in der Anforderungsverarbeitungspipeline nach dem Aufruf UseHttpsRedirectionauf UseStaticFiles , um die Bereitstellung statischer Dateien aus dem Webstamm der App zu aktivieren:
app.UseStaticFiles();
Auf statische Dateien kann über einen Pfad relativ zum Webstammverzeichnis zugegriffen werden.
Greifen Sie auf ein Bild zu unter wwwroot/images/favicon.png:
- URL-Format:
https://{HOST}/images/{FILE NAME}- Der
{HOST}Platzhalter ist der Host. - Der
{FILE NAME}Platzhalter ist der Dateiname.
- Der
- Beispiele
- Absolute URL:
https://localhost:5001/images/favicon.png - Stammrelative URL:
images/favicon.png
- Absolute URL:
In einer Blazor-App lädt images/favicon.png das Symbolbild (favicon.png) aus dem wwwroot/images-Ordner der App.
<link rel="icon" type="image/png" href="images/favicon.png" />
In Razor Seiten- und MVC-Apps zeigt das Tildezeichen ~ auf den Webstamm. Im folgenden Beispiel ~/images/favicon.png wird das Symbolbild (favicon.png) aus dem Ordner der App wwwroot/images geladen:
<link rel="icon" type="image/png" href="~/images/favicon.png" />
Umgehen der Middleware-Pipeline
Um zu vermeiden, dass die gesamte Middleware-Pipeline ausgeführt wird, nachdem eine statische Ressource abgeglichen wurde, was das Verhalten von UseStaticFiles ist, rufen Sie ShortCircuit auf MapStaticAssets auf. Durch das Aufrufen von ShortCircuit wird der Endpunkt sofort ausgeführt und die Antwort zurückgegeben, wodurch verhindert wird, dass andere Middleware für Anforderungen zu statischen Ressourcen ausgeführt wird.
app.MapStaticAssets().ShortCircuit();
Steuern der zwischenspeicherung statischer Dateien während der Entwicklung
Wenn sie in der Development Umgebung ausgeführt werden, z. B. beim Testen der Visual Studio Hot Reload-Entwicklung , überschreibt das Framework Cacheheader, um zu verhindern, dass Browser statische Dateien zwischenspeichern. Dieses Verhalten trägt dazu bei, sicherzustellen, dass die neueste Version von Dateien verwendet wird, wenn Dateien geändert werden und Probleme mit veralteten Inhalten vermieden werden. In der Produktion legt das Framework die richtigen Cacheheader fest, sodass Browser statische Ressourcen wie erwartet zwischenspeichern können.
Um dieses Verhalten zu deaktivieren, legen Sie EnableStaticAssetsDevelopmentCaching auf true in der App-Einstellungsdatei der Development Umgebung (appsettings.Development.json) fest.
Statische Dateien in Nicht-Development-Umgebungen
Wenn Sie eine App lokal ausführen, ist die Development Umgebung die einzige Umgebung, die statische Webressourcen ermöglicht. Um statische Dateien für andere Umgebungen als Development während der lokalen Entwicklung und Tests (z. B. in der Staging Umgebung) zu aktivieren, rufen Sie UseStaticWebAssets auf dem WebApplicationBuilder auf.
Warning
Rufen Sie UseStaticWebAssets die genaue Umgebung auf, um zu verhindern, dass das Feature in der Produktion aktiviert wird, da es Dateien von separaten Speicherorten auf einem anderen Datenträger als vom Projekt bedient. Das Beispiel in diesem Abschnitt überprüft die Staging Umgebung mit IsStaging.
if (builder.Environment.IsStaging())
{
builder.WebHost.UseStaticWebAssets();
}
Bereitstellen von Dateien außerhalb des Webstammverzeichnisses über IWebHostEnvironment.WebRootPath
Wenn Sie IWebHostEnvironment.WebRootPath auf einen anderen Ordner als wwwroot festlegen, zeigt die App die folgenden Standardverhaltensweisen:
- In der
DevelopmentUmgebung werden statische Assets vonwwwrootbereitgestellt, wenn Assets mit demselben Namen sowohl inwwwrootals auch in einem anderen Ordner, der WebRootPath zugewiesen ist, vorhanden sind. - In einer anderen Umgebung als
Developmentwerden doppelte statische Objekte aus dem WebRootPath Ordner bereitgestellt.
Betrachten Sie eine Web-App, die aus der leeren Webvorlage erstellt wurde:
- Sie enthält eine Datei
Index.htmlinwwwrootundwwwroot-custom. - Die
ProgramDatei wird aktualisiert, umWebRootPath = "wwwroot-custom"festzulegen.
var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
Args = args,
WebRootPath = "wwwroot-custom"
});
Standardmäßig gelten für Anforderungen an /:
-
Developmentwird in derwwwroot/Index.htmlUmgebung zurückgegeben. - In jeder Umgebung außer
Developmentwirdwwwroot-custom/Index.htmlzurückgegeben.
Um sicherzustellen, dass Ressourcen wwwroot-custom immer zurückgegeben werden, verwenden Sie einen der folgenden Ansätze:
Löschen doppelt benannter Objekte in
wwwroot.Legen Sie
ASPNETCORE_ENVIRONMENTinProperties/launchSettings.jsonauf einen beliebigen anderen Wert alsDevelopmentfest.Deaktivieren Sie statische Webressourcen, indem Sie in der Projektdatei der App
<StaticWebAssetsEnabled>auffalsefestlegen. WARNUNG: Durch das Deaktivieren statischer Webressourcen werden KlassenbibliothekenRazor deaktiviert.Fügen Sie der Projektdatei den folgenden XML-Code hinzu:
<ItemGroup> <Content Remove="wwwroot\**" /> </ItemGroup>
Der folgende Code aktualisiert WebRootPath auf einen Nicht-Entwicklungswert (Staging), was garantiert, dass doppelte Inhalte von wwwroot-custom anstelle von wwwroot zurückgegeben werden.
var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
Args = args,
EnvironmentName = Environments.Staging,
WebRootPath = "wwwroot-custom"
});
Middleware für statische Dateien
Die Middleware für statische Dateien ermöglicht die Bereitstellung statischer Dateien in bestimmten Szenarien für statische Dateien, in der Regel zusätzlich zu den Endpunktroutingkonventionen für Map Static Assets (MapStaticAssets).
Binden Sie die Middleware für statische Dateien in die Anforderungsverarbeitung ein, wenn Sie UseStaticFiles in der Anforderungsverarbeitungspipeline der App aufrufen, in der Regel nachdem Sie Endpunktkonventionen für das Zuordnen statischer Assets (MapStaticAssets) hinzugefügt haben.
Verwenden Sie in Apps, die auf .NET 9 oder höher abzielen, die Endpunktkonventionen von Map Static Assets. Verwenden Sie statische Datei-Middleware in Apps, die auf Versionen von .NET vor .NET 9 abzielen.
Die Middleware für statische Dateien stellt statische Dateien bereit, bietet jedoch nicht den gleichen Optimierungsgrad wie die Endpunktkonventionen von Map Static Assets für statische Ressourcen. Die Features für die Komprimierung zur Buildzeit und das Fingerprinting der Endpunktkonventionen von Map Static Assets sind nicht verfügbar, wenn Sie sich nur auf Middleware für statische Dateien verlassen.
Die Endpunktkonventionen sind für die Bereitstellung von Ressourcen optimiert, die von der App zur Laufzeit bekannt sind. Wenn die App Ressourcen von anderen Speicherorten wie Datenträger oder eingebetteten Ressourcen bedient, verwenden Sie statische Datei-Middleware.
Die folgenden in diesem Artikel beschriebenen Funktionen werden von der Middleware für statische Dateien unterstützt, jedoch nicht von den Endpunktkonventionen von Map Static Assets:
- Bereitstellen von Dateien außerhalb des Webstammverzeichnisses
- Festlegen von HTTP-Antwortheadern
- Bereitstellen von Dateien von Datenträgern, eingebetteten Ressourcen oder anderen Speicherorten
- Verzeichnisbrowsen
- Bereitstellen von Standarddokumenten (mit MapStaticAssets, erfordert einen Aufruf an UseStaticFiles)
- Kombinieren statischer Dateien, Standarddokumente und Verzeichnisbrowsen
- Zuordnen von Dateierweiterungen zu MIME-Typen
- Bereitstellen nicht standardmäßiger Inhaltstypen
Bereitstellen von Dateien außerhalb des Webstammverzeichnisses über UseStaticFiles
Betrachten Sie die folgende Verzeichnishierarchie mit statischen Dateien, die sich außerhalb des Webstamms der App befinden, in einem Ordner mit dem Namen ExtraStaticFiles:
wwwrootcssimagesjs
ExtraStaticFilesimagesred-rose.jpg
Eine Anfrage kann auf red-rose.jpg zugreifen, indem eine neue Instanz der Middleware für statische Dateien konfiguriert wird:
Namespaces für die folgende API:
using Microsoft.Extensions.FileProviders;
In der Anforderungsverarbeitungspipeline nach dem vorhandenen Aufruf von entweder MapStaticAssets (.NET 9 oder höher) oder UseStaticFiles (.NET 8 oder früher):
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(builder.Environment.ContentRootPath, "ExtraStaticFiles")),
RequestPath = "/static-files"
});
Im vorherigen Code ist die ExtraStaticFiles Verzeichnishierarchie über das static-files URL-Segment öffentlich zugänglich. Eine Anfrage an https://{HOST}/StaticFiles/images/red-rose.jpg, bei der der Platzhalter {HOST} der Host ist, liefert die red-rose.jpg Datei aus.
Folgendes Markup verweist auf ExtraStaticFiles/images/red-rose.jpg:
<img src="static-files/images/red-rose.jpg" alt="A red rose" />
Im vorherigen Beispiel Razor unterstützen Seiten und MVC-Ansichten die Tilde-Schrägstrich-Notation (src="~/StaticFiles/images/red-rose.jpg"), aber Komponenten in Blazor-Apps unterstützen diese Notation nicht.
Bereitstellen von Dateien aus mehreren Speicherorten
Die Anleitungen in diesem Abschnitt gelten für Razor Seiten und MVC-Apps. Anleitungen, die für Blazor Web App gelten, finden Sie unter Statische Dateien in ASP.NET Core-Blazor.
Beachten Sie das folgende Markup, das ein Firmenlogo anzeigt:
<img src="~/logo.png" asp-append-version="true" alt="Company logo">
Der Entwickler beabsichtigt, das Imagetag-Hilfsprogramm zu verwenden, um eine Version anzufügen und die Datei an einem benutzerdefinierten Speicherort zu bedienen, einem Ordner mit dem Namen ExtraStaticFiles.
Im folgenden Beispiel werden MapStaticAssets zum Bereitstellen von Dateien aus wwwroot und UseStaticFiles zum Bereitstellen von Dateien aus ExtraStaticFiles verwendet.
In der Anforderungsverarbeitungspipeline nach dem vorhandenen Aufruf von entweder MapStaticAssets (.NET 9 oder höher) oder UseStaticFiles (.NET 8 oder früher):
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(builder.Environment.ContentRootPath, "ExtraStaticFiles"))
});
Im folgenden Beispiel wird UseStaticFiles zweimal aufgerufen, um Dateien sowohl aus wwwroot als auch aus ExtraStaticFiles bereitzustellen.
In der Anforderungsverarbeitungspipeline nach dem vorhandenen Aufruf von UseStaticFiles:
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(builder.Environment.ContentRootPath, "ExtraStaticFiles"))
});
Mit dem vorherigen Code wird die ExtraStaticFiles/logo.png Datei angezeigt. Das Bildtag-Hilfsprogramm (AppendVersion) wird jedoch nicht angewendet, da das Tag-Hilfsprogramm von WebRootFileProvider abhängt, welches nicht aktualisiert wurde, um den ExtraStaticFiles Ordner einzuschließen.
Der folgende Code aktualisiert den WebRootFileProvider, um den ExtraStaticFiles-Ordner mithilfe eines CompositeFileProvider einzuschließen. Dies ermöglicht es dem Bild-Tag-Hilfsprogramm, eine Version auf die Bilder im ExtraStaticFiles-Ordner anzuwenden.
Namespace für die folgende API:
using Microsoft.Extensions.FileProviders;
In der Anforderungsverarbeitungspipeline vor dem vorhandenen Aufruf von MapStaticAssets (.NET 9 oder höher) oder UseStaticFiles (.NET 8 oder früher):
var webRootProvider = new PhysicalFileProvider(builder.Environment.WebRootPath);
var newPathProvider = new PhysicalFileProvider(
Path.Combine(builder.Environment.ContentRootPath, "ExtraStaticFiles"));
var compositeProvider = new CompositeFileProvider(webRootProvider, newPathProvider);
app.Environment.WebRootFileProvider = compositeProvider;
Bei UseStaticFiles und UseFileServer zeigt der Dateianbieter standardmäßig auf wwwroot. Sie können zusätzliche Instanzen von UseStaticFiles und UseFileServer anderen Dateianbietern bereitstellen, um Dateien von anderen Speicherorten zu bedienen. Weitere Informationen finden Sie unter UseStaticFiles, das weiterhin in Verbindung mit UseFileServer für wwwroot benötigt wird (dotnet/AspNetCore.Docs #15578).
Festlegen von HTTP-Antwortheadern
Verwenden Sie StaticFileOptions, um HTTP-Antwortheader festzulegen. Zusätzlich zum Konfigurieren statischer Datei-Middleware für statische Dateien legt der folgende Code den Cache-Control Header auf 604.800 Sekunden (eine Woche) fest.
Namespaces für die folgende API:
using Microsoft.AspNetCore.Http;
In der Anforderungsverarbeitungspipeline nach dem vorhandenen Aufruf von entweder MapStaticAssets (.NET 9 oder höher) oder UseStaticFiles (.NET 8 oder früher):
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = ctx =>
{
ctx.Context.Response.Headers.Append(
"Cache-Control", "public, max-age=604800");
}
});
Große Sammlung von Assets
Wenn Sie mit großen Sammlungen von Ressourcen arbeiten, also mit etwa 1.000 oder mehr Ressourcen, verwenden Sie ein Bundling-Tool, um die endgültige Anzahl der von Ihrer App bereitgestellten Ressourcen zu reduzieren, oder kombinieren Sie UseStaticFiles mit MapStaticAssets.
MapStaticAssets lädt bereitwillig die vorkompilierten Metadaten, die während des Buildprozesses für die Ressourcen erfasst wurden, um Komprimierung, Caching und Fingerprinting zu unterstützen. Diese Features werden durch die App zu einem höheren Speicherverbrauch führen. Für Ressourcen, auf die häufig zugegriffen wird, lohnen sich die Kosten in der Regel. Für Ressourcen, auf die nicht häufig zugegriffen wird, ist der Kompromiss möglicherweise nicht die Kosten wert.
Wenn Sie keine Bündelung verwenden, kombinieren Sie MapStaticAssets mit UseStaticFiles. Im folgenden Beispiel wird der Ansatz veranschaulicht.
In der Projektdatei (.csproj) wird die StaticWebAssetEndpointExclusionPattern MSBuild-Eigenschaft verwendet, um Endpunkte aus dem endgültigen Manifest für MapStaticAssets herauszufiltern. Ausgeschlossene Dateien werden von UseStaticFiles bedient und profitieren nicht von Komprimierung, Zwischenspeicherung und Fingerprinting.
Um das Standardausschlussmuster des Frameworks beizubehalten, behalten Sie es $(StaticWebAssetEndpointExclusionPattern) beim Festlegen des Werts von StaticWebAssetEndpointExclusionPattern. Fügen Sie in einer durch Semikolons getrennten Liste weitere Muster hinzu.
Im folgenden Beispiel fügt das Ausschlussmuster die statischen Dateien im lib/icons Ordner hinzu, die einen hypothetischen Stapel von Symbolen darstellen:
<StaticWebAssetEndpointExclusionPattern>
$(StaticWebAssetEndpointExclusionPattern);lib/icons/**
</StaticWebAssetEndpointExclusionPattern>
Nach der Verarbeitung durch die HTTPS-Umleitungs-Middleware (app.UseHttpsRedirection();) in der Datei Program:
- Rufen Sie UseStaticFiles auf, um die exklusiven Dateien (
lib/icons/**) und alle anderen Dateien zu verarbeiten, die nicht von MapStaticAssets abgedeckt werden. - Rufen Sie MapStaticAssets nach UseStaticFiles auf, um kritische Anwendungsdateien (CSS, JS, Bilder) zu verarbeiten.
app.UseStaticFiles();
app.UseAuthorization();
app.MapStaticAssets();
Manifest statischer Ressourcen
MapStaticAssets liefert Assets aus einem statischen Asset-Manifest, anstatt das Webstammverzeichnis zur Laufzeit zu scannen. Das Manifest wird zur Build- und Veröffentlichungszeit generiert und erfasst die für die App ermittelten statischen Webressourcen zusammen mit Metadaten wie Inhaltsfingerprints, Content-Type-Headern, Cacheheadern und den vorab berechneten komprimierten Darstellungen (Gzip und Brotli). Zur Laufzeit MapStaticAssets liest das Manifest, registriert einen Endpunkt für jede Ressource und liefert die optimierten Antworten.
Der Buildprozess generiert das Manifest im Buildausgabeverzeichnis. Der Dateiname basiert auf dem Assemblynamen des Projekts (z. B. {ASSEMBLY NAME}.staticwebassets.endpoints.json, wobei der Platzhalter {ASSEMBLY NAME} dem MSBuild-Wert AssemblyName der App entspricht). Informationen zum Bereitstellen eines Manifests von einem anderen Speicherort finden Sie im Abschnitt " Bereitstellen eines benutzerdefinierten Manifests für statische Dateien ".
Da MapStaticAssets nur die im Manifest aufgeführten Assets bereitstellt, werden keine Dateien bereitgestellt, die nicht Teil des Manifests sind. Dateien sind nicht Teil des Manifests, wenn sie:
- Außerhalb des Web-Stammverzeichnisses zur Erstellungszeit, wie beispielsweise Dateien, die von der Festplatte bereitgestellt werden, eingebettete Ressourcen oder eine benutzerdefinierte WebRootPath, das zur Laufzeit festgelegt wird.
- Aus dem Manifest mit der
StaticWebAssetEndpointExclusionPatternMSBuild-Eigenschaft ausgeschlossen (siehe den Abschnitt Große Sammlung von Ressourcen).
Um Dateien bereitzustellen, die nicht im Manifest enthalten sind, rufen Sie UseStaticFiles auf, wodurch Dateien zur Laufzeit direkt aus dem Webstamm bereitgestellt werden. Dies ist auch der Grund, warum das Ausliefern von Standarddokumenten mit MapStaticAssets einen Aufruf von UseStaticFiles erfordert.
Integrieren von buildgenerierten Dateien in statische Webressourcen
Buildtools wie TypeScript-Compiler und JavaScript-Bundler erzeugen häufig Dateien während des Builds. Um diese generierten Dateien mit dem Fingerprinting, der Komprimierung und dem Caching bereitzustellen, die MapStaticAssets bietet, müssen sie während des Builds als statische Webressourcen erkannt werden. Generierte Dateien werden in der Regel außerhalb des Webstamms (wwwroot) gespeichert und von der Quellcodeverwaltung ausgeschlossen, sodass sie standardmäßig nicht als statische Webressourcen erkannt werden. Nur Dateien, die beim Auflösen statischer Webressourcen während des Builds als unter wwwroot befindlich ermittelt werden, werden dem Manifest für statische Ressourcen hinzugefügt und von MapStaticAssets bereitgestellt. Dateien, die in <Content> eingebunden sind (z. B. mit einem Link-Element und einem wwwroot), werden ebenfalls einbezogen, auch wenn die Quelldatei außerhalb von wwwroot gespeichert ist.
Um buildgenerierte Dateien als statische Webressourcen einzuschließen, verwenden Sie eine der folgenden Ansätze.
Verknüpfen generierter Dateien mit dem Webstamm
Fügen Sie ein <Content> Element mit einem Link hinzu, das jede generierte Datei unter wwwroot ablegt. Eine Datei, die in wwwroot verknüpft ist, wird von der Pipeline für statische Webressourcen erkannt und von MapStaticAssets mit Fingerprinting, Komprimierung und Caching bereitgestellt, obwohl die Quelldatei außerhalb von wwwroot gespeichert ist.
Im folgenden Beispiel erzeugt ein Buildschritt main.js in einem generated-Ordner, und der <Content>-Eintrag bindet die Datei in wwwroot ein:
<ItemGroup>
<Content Include="generated\main.js" Link="wwwroot\main.js"
CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
Die generierte Datei muss vorhanden sein, wenn der Buildprozess statische Webressourcen auflöst.
Verwenden Sie ein JavaScript-Projekt für komplexe Build-Pipelines
Verwenden Sie für einen komplexen JavaScript- oder TypeScript-Clientbuild ein separates JavaScript-Projekt, das die Clientressourcen mit dem JavaScript-Projektsystem erstellt (das Microsoft.VisualStudio.JavaScript.Sdk MSBuild SDK und eine .esproj Projektdatei). Verweisen Sie auf das JavaScript-Projekt aus der ASP.NET Core-App, sodass die Ausgabe als statische Webressourcen verwendet wird. Ein Beispiel finden Sie in der Microsoft.FluentUI.AspNetCore.Components.Assets.esproj Projektdatei (microsoft/fluentui-blazor GitHub Repository).
Autorisierung statischer Dateien
Wenn eine App eine Fallbackautorisierungsrichtlinie einnimmt, erfordert sie eine Autorisierung für Anforderungen, die von Autorisierungs-Middleware verarbeitet werden, wenn keine Richtlinie aus Autorisierungsmetadaten erstellt wird. Diese Anforderung umfasst Anforderungen für statische Objekte, die als Endpunkte zugeordnet sind. Um anonymen Zugriff auf statische Ressourcen zu ermöglichen, wenden Sie AllowAnonymousAttribute auf den Endpunktersteller an:
app.MapStaticAssets().Add(endpointBuilder =>
endpointBuilder.Metadata.Add(new AllowAnonymousAttribute()));
Wenn eine App eine Fallbackautorisierungsrichtlinie einnimmt, ist die Autorisierung für Anforderungen erforderlich, die von Autorisierungs-Middleware verarbeitet werden, wenn keine Richtlinie aus Autorisierungsmetadaten erstellt wird. Die ASP.NET Core-Vorlagen ermöglichen anonymen Zugriff auf statische Dateien, indem UseStaticFiles vor UseAuthorization aufgerufen wird. Die meisten Apps folgen diesem Muster. Wenn die statische Datei-Middleware vor der Autorisierungs-Middleware aufgerufen wird:
- In den statischen Dateien werden keine Autorisierungsüberprüfungen durchgeführt.
- Statische Dateien, die von der Middleware für statische Dateien bereitgestellt werden, z. B. solche im Webstamm (in der Regel
wwwroot), sind öffentlich zugänglich.
So stellen Sie statische Dateien basierend auf Autorisierung bereit:
- Vergewissern Sie sich, dass die App die Fallbackautorisierungsrichtlinie so festlegt, dass authentifizierte Benutzer erforderlich sind.
- Speichern Sie die statische Datei außerhalb des Webstamms der App.
- Rufen Sie UseAuthorization auf und anschließend UseStaticFiles, indem Sie den Pfad zum Ordner mit statischen Dateien außerhalb des Webstamms angeben.
Namespaces für die folgende API:
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.FileProviders;
Dienstregistrierung:
builder.Services.AddAuthorization(options =>
{
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
In der Anforderungsverarbeitungspipeline nach dem Aufruf von UseAuthorization:
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(builder.Environment.ContentRootPath, "SecureStaticFiles")),
RequestPath = "/static-files"
});
Namespaces für die folgende API:
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.FileProviders;
In Startup.ConfigureServices:
services.AddAuthorization(options =>
{
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
In Startup.Configure im Anschluss an den Anruf an UseAuthorization:
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(env.ContentRootPath, "SecureStaticFiles")),
RequestPath = "/static-files"
});
Im vorherigen Code erfordert die Fallbackautorisierungsrichtlinie authentifizierte Benutzer. Endpunkte, die Autorisierungsanforderungen angeben, verwenden die richtlinie, die aus ihren Autorisierungsmetadaten erstellt wurde, anstelle der Fallbackrichtlinie. Vollständige Richtlinienauswahlregeln finden Sie unter Richtlinienbasierte Autorisierung in ASP.NET Core.
RequireAuthenticatedUser fügt der aktuellen Instanz DenyAnonymousAuthorizationRequirement hinzu. Dadurch wird die Authentifizierung des aktuellen Benutzers erzwungen.
Statische Objekte, die im Webstamm der App gespeichert sind, sind öffentlich zugänglich, da die standardmäßige statische Datei-Middleware (UseStaticFiles) vor UseAuthorizationaufgerufen wird. Statische Objekte im SecureStaticFiles Ordner erfordern eine Authentifizierung.
Eine Alternative zum Bereitstellen von Dateien basierend auf Autorisierung ist folgendes Verfahren:
- Speichern Sie die Dateien außerhalb des Webstammverzeichnisses und aller Verzeichnisse, auf die von Middleware für statische Dateien zugegriffen werden kann.
- Dienen Sie die Dateien über eine Aktionsmethode, auf die die Autorisierung angewendet wird, und geben Sie ein FileResult Objekt zurück.
Von einer Razor Seite (Pages/BannerImage.cshtml.cs):
public class BannerImageModel : PageModel
{
private readonly IWebHostEnvironment _env;
public BannerImageModel(IWebHostEnvironment env) => _env = env;
public PhysicalFileResult OnGet()
{
var filePath = Path.Combine(
_env.ContentRootPath, "SecureStaticFiles", "images", "red-rose.jpg");
return PhysicalFile(filePath, "image/jpeg");
}
}
Von einem Controller (Controllers/HomeController.cs):
[Authorize]
public IActionResult BannerImage()
{
var filePath = Path.Combine(
_env.ContentRootPath, "SecureStaticFiles", "images", "red-rose.jpg");
return PhysicalFile(filePath, "image/jpeg");
}
Für den vorherigen Ansatz ist eine Seite oder ein Endpunkt pro Datei erforderlich.
Im folgenden Routenendpunktbeispiel werden Dateien für authentifizierte Benutzer zurückgegeben.
In der Program-Datei:
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AuthenticatedUsers", b => b.RequireAuthenticatedUser());
});
...
app.MapGet("/files/{fileName}", IResult (string fileName) =>
{
var filePath = GetOrCreateFilePath(fileName);
if (File.Exists(filePath))
{
return TypedResults.PhysicalFile(filePath, fileName);
}
return TypedResults.NotFound("No file found with the supplied file name");
})
.WithName("GetFileByName")
.RequireAuthorization("AuthenticatedUsers");
Im folgenden Routenendpunktbeispiel werden Dateien für authentifizierte Benutzer in der Administratorrolle (admin) hochgeladen.
In der Program-Datei:
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AdminsOnly", b => b.RequireRole("admin"));
});
...
// IFormFile uses memory buffer for uploading. For handling large
// files, use streaming instead. See the *File uploads* article
// in the ASP.NET Core documentation:
// https://learn.microsoft.com/aspnet/core/mvc/models/file-uploads
app.MapPost("/files", async (IFormFile file, LinkGenerator linker,
HttpContext context) =>
{
// Don't rely on the value in 'file.FileName', as it's only metadata that can
// be manipulated by the end-user. Consider the 'Utilities.IsFileValid' method
// that takes an 'IFormFile' and validates its signature within the
// 'AllowedFileSignatures'.
var fileSaveName = Guid.NewGuid().ToString("N") +
Path.GetExtension(file.FileName);
await SaveFileWithCustomFileName(file, fileSaveName);
context.Response.Headers.Append("Location", linker.GetPathByName(context,
"GetFileByName", new { fileName = fileSaveName}));
return TypedResults.Ok("File Uploaded Successfully!");
})
.RequireAuthorization("AdminsOnly");
In Startup.ConfigureServices:
services.AddAuthorization(options =>
{
options.AddPolicy("AuthenticatedUsers", b => b.RequireAuthenticatedUser());
});
In Startup.Configure:
app.MapGet("/files/{fileName}", IResult (string fileName) =>
{
var filePath = GetOrCreateFilePath(fileName);
if (File.Exists(filePath))
{
return TypedResults.PhysicalFile(filePath, fileName);
}
return TypedResults.NotFound("No file found with the supplied file name");
})
.WithName("GetFileByName")
.RequireAuthorization("AuthenticatedUsers");
Mit dem folgenden Code werden Dateien für authentifizierte Benutzer in der Administratorrolle (admin) hochgeladen.
In Startup.ConfigureServices:
services.AddAuthorization(options =>
{
options.AddPolicy("AdminsOnly", b => b.RequireRole("admin"));
});
In Startup.Configure:
// IFormFile uses memory buffer for uploading. For handling large
// files, use streaming instead. See the *File uploads* article
// in the ASP.NET Core documentation:
// https://learn.microsoft.com/aspnet/core/mvc/models/file-uploads
app.MapPost("/files", async (IFormFile file, LinkGenerator linker,
HttpContext context) =>
{
// Don't rely on the value in 'file.FileName', as it's only metadata that can
// be manipulated by the end-user. Consider the 'Utilities.IsFileValid' method
// that takes an 'IFormFile' and validates its signature within the
// 'AllowedFileSignatures'.
var fileSaveName = Guid.NewGuid().ToString("N") +
Path.GetExtension(file.FileName);
await SaveFileWithCustomFileName(file, fileSaveName);
context.Response.Headers.Append("Location", linker.GetPathByName(context,
"GetFileByName", new { fileName = fileSaveName}));
return TypedResults.Ok("File Uploaded Successfully!");
})
.RequireAuthorization("AdminsOnly");
Verzeichnisbrowsen
Die Verzeichnissuche ermöglicht die Verzeichnisauflistung in angegebenen Verzeichnissen.
Aus Sicherheitsgründen ist das Verzeichnisbrowsen standardmäßig deaktiviert. Weitere Informationen finden Sie unter Sicherheitsüberlegungen für statische Dateien.
Aktivieren Sie das Verzeichnisbrowsen mithilfe der folgenden APIs:
Im folgenden Beispiel:
- Ein
imagesOrdner im Stammverzeichnis der App enthält Bilder zum Durchsuchen von Verzeichnissen. - Der Anforderungspfad zum Durchsuchen der Bilder lautet
/DirectoryImages. - Durch das Aufrufen von UseStaticFiles und das Festlegen von FileProvider wird das Anzeigen von StaticFileOptions-Browserlinks zu den einzelnen Dateien ermöglicht.
Namespaces für die folgende API:
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders;
Dienstregistrierung:
builder.Services.AddDirectoryBrowser();
In der Anforderungsverarbeitungspipeline nach dem vorhandenen Aufruf von entweder MapStaticAssets (.NET 9 oder höher) oder UseStaticFiles (.NET 8 oder früher):
var fileProvider = new PhysicalFileProvider(
Path.Combine(builder.Environment.WebRootPath, "images"));
var requestPath = "/DirectoryImages";
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = fileProvider,
RequestPath = requestPath
});
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
FileProvider = fileProvider,
RequestPath = requestPath
});
Namespaces für die folgende API:
using Microsoft.Extensions.FileProviders;
using System.IO;
In Startup.ConfigureServices:
services.AddDirectoryBrowser();
In Startup.Configure im Anschluss an den Aufruf an UseStaticFiles:
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(env.WebRootPath, "images")),
RequestPath = "/DirectoryImages"
});
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(env.WebRootPath, "images")),
RequestPath = "/DirectoryImages"
});
Der vorangehende Code ermöglicht das Verzeichnisbrowsen des wwwroot/images Ordners mithilfe der URL https://{HOST}/DirectoryImages mit Links zu jeder Datei und jedem Ordner, wobei der {HOST} Platzhalter der Host ist.
AddDirectoryBrowser fügt Dienste hinzu, die von der Middleware für das Verzeichnisbrowsen erforderlich sind, einschließlich HtmlEncoder. Diese Dienste werden möglicherweise durch andere Aufrufe hinzugefügt, wie z. B. AddRazorPages. Rufen Sie jedoch AddDirectoryBrowser auf, um sicherzustellen, dass die Dienste hinzugefügt werden.
Bereitstellen von Standarddokumenten
Durch das Festlegen einer Standardseite wird Besuchern ein Ausgangspunkt auf einer Website bereitgestellt. Rufen Sie die Methode auf, um eine Standarddatei von wwwroot bereitzustellen, ohne dass die Anforderungs-URL den Dateinamen enthalten muss.
UseDefaultFiles ist ein URL-Rewriter, der die Datei nicht verarbeiten kann. Sie schreibt die Anforderungs-URL in das Standarddokument um (z. B / . in /index.html), und eine andere Komponente dient der Datei.
Da MapStaticAssets Ressourcen, die während des Builds über Endpunktrouting ermittelt werden, bereitstellt, werden Standarddokumente nicht von selbst bereitgestellt. Rufen Sie UseDefaultFiles auf, um die Anforderung umzuschreiben, gefolgt von UseStaticFiles, um die umgeschriebene Anforderung für das Standarddokument bereitzustellen:
app.UseDefaultFiles();
app.UseStaticFiles();
app.MapStaticAssets();
Important
Das Konfigurieren nur von UseDefaultFiles und MapStaticAssets (ohne UseStaticFiles) führt bei einer Anforderung an / zu einer 404 - Not Found-Antwort. Dieses Verhalten tritt auf, weil das minimale Hostingmodell zu Beginn der Anforderungsverarbeitungspipeline die Routing-Middleware hinzufügt, sodass die Anforderung vom Endpunktrouting abgeglichen wird, bevor UseDefaultFiles sie in das Standarddokument umschreibt. Das Problem ist besonders offensichtlich, wenn Sie das Webstammverzeichnis mit WebRootPath in einen benutzerdefinierten Pfad ändern, da Dateien in einem benutzerdefinierten Webstammverzeichnis nicht Teil des Manifests statischer Ressourcen zur Buildzeit sind, das von MapStaticAssets bereitgestellt wird. Fügen Sie nach UseDefaultFiles einen Aufruf von UseStaticFiles hinzu, wie im vorangehenden Beispiel gezeigt, um Standarddokumente bereitzustellen.
In der Anforderungsverarbeitungspipeline vor dem vorhandenen Aufruf von UseStaticFiles:
app.UseDefaultFiles();
Bei UseDefaultFiles werden bei Anforderungen an einen Ordner in wwwroot folgende Dateien durchsucht:
default.htmdefault.htmlindex.htmindex.html
Die erste in der Liste gefundene Datei wird bereitgestellt, als wäre die Anforderung im Dateinamen enthalten. Die Browser-URL spiegelt weiterhin den angeforderten URI wider.
Mit dem folgenden Code wird der Standarddateiname in default-document.html geändert:
var options = new DefaultFilesOptions();
options.DefaultFileNames.Clear();
options.DefaultFileNames.Add("default-document.html");
app.UseDefaultFiles(options);
Kombinieren statischer Dateien, Standarddokumente und Verzeichnisbrowsen
In UseFileServer werden die Funktionen von UseStaticFiles, UseDefaultFiles und (optional) UseDirectoryBrowser miteinander kombiniert.
Rufen Sie in der Anforderungsverarbeitungspipeline nach dem vorhandenen Aufruf von entweder MapStaticAssets (.NET 9 oder höher) oder UseStaticFiles (.NET 8 oder früher) UseFileServer auf, um die Bereitstellung statischer Dateien sowie der Standarddatei zu aktivieren:
app.UseFileServer();
Das Verzeichnisbrowsen ist für das vorherige Beispiel nicht aktiviert.
Der folgende Code ermöglicht die Bereitstellung statischer Dateien, der Standarddatei und des Verzeichnisbrowsens.
Dienstregistrierung:
builder.Services.AddDirectoryBrowser();
In der Anforderungsverarbeitungspipeline nach dem vorhandenen Aufruf von UseStaticFiles:
app.UseFileServer(enableDirectoryBrowsing: true);
In Startup.ConfigureServices:
services.AddDirectoryBrowser();
In Startup.Configure im Anschluss an den Aufruf an UseStaticFiles:
app.UseFileServer(enableDirectoryBrowsing: true);
Gibt für die Hostadresse (/) UseFileServer das STANDARD-HTML-Dokument vor der Standardseite Razor (Pages/Index.cshtml) oder der MVC-Standardansicht (Home/Index.cshtml) zurück.
Betrachten Sie die folgende Verzeichnishierarchie:
wwwrootcssimagesjs
ExtraStaticFilesimageslogo.png
default.html
Der folgende Code ermöglicht die Bereitstellung statischer Dateien, der Standarddatei und des Verzeichnisbrowsens von ExtraStaticFiles.
Namespaces für die folgende API:
using Microsoft.Extensions.FileProviders;
Dienstregistrierung:
builder.Services.AddDirectoryBrowser();
In der Anforderungsverarbeitungspipeline nach dem vorhandenen Aufruf von UseStaticFiles:
app.UseFileServer(new FileServerOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(builder.Environment.ContentRootPath, "ExtraStaticFiles")),
RequestPath = "/static-files",
EnableDirectoryBrowsing = true
});
Namespaces für die folgende API:
using Microsoft.Extensions.FileProviders;
using System.IO;
In Startup.ConfigureServices:
services.AddDirectoryBrowser();
In Startup.Configure im Anschluss an den Aufruf an UseStaticFiles:
app.UseFileServer(new FileServerOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(env.ContentRootPath, "ExtraStaticFiles")),
RequestPath = "/static-files",
EnableDirectoryBrowsing = true
});
AddDirectoryBrowser muss aufgerufen werden, wenn der EnableDirectoryBrowsing-Eigenschaftswert true lautet.
Unter Verwendung der vorherigen Dateihierarchie und des vorangehenden Codes werden URLs wie in der folgenden Tabelle dargestellt aufgelöst (der Platzhalter {HOST} ist der Host).
| URI | Antwortdatei |
|---|---|
https://{HOST}/static-files/images/logo.png |
ExtraStaticFiles/images/logo.png |
https://{HOST}/static-files |
ExtraStaticFiles/default.html |
Wenn keine standardmäßig benannte Datei im ExtraStaticFiles Verzeichnis vorhanden ist, https://{HOST}/static-files wird der Verzeichniseintrag mit klickbaren Links zurückgegeben, wobei der {HOST} Platzhalter der Host ist.
UseDefaultFiles und UseDirectoryBrowser führen eine clientseitige Umleitung vom Ziel-URI ohne angehängten / zum Ziel-URI mit angehängtem / durch. Beispiel: von https://{HOST}/static-files (keine nachgestellten /) bis https://{HOST}/static-files/ (enthält einen nachgestellten /). Relative URLs im Verzeichnis ExtraStaticFiles gelten ohne nachstehenden Schrägstrich (/) als ungültig, sofern nicht die RedirectToAppendTrailingSlash-Option von DefaultFilesOptions verwendet wird.
Zuordnen von Dateierweiterungen zu MIME-Typen
Note
Anleitungen, die für Blazor Apps gelten, finden Sie unter ASP.NET Core Blazor static files.
Verwenden Sie FileExtensionContentTypeProvider.Mappings, um Dateierweiterungen zu Zuordnungen von MIME-Inhaltstypen hinzuzufügen oder zu ändern.
Note
FileExtensionContentTypeProvider ist nicht threadsicher für gleichzeitige Schreibvorgänge. Sein internes Zuordnungswörterbuch ist ein standardmäßiges Dictionary<string, string>, das nicht synchronisiert ist. Die Zuordnungen des Anbieters sollten einmal beim Start konfiguriert werden. Wenn danach nur Lesevorgänge (Lookups) durchgeführt werden, kann der Provider bedenkenlos als Singleton registriert werden. Sobald der Provider von gleichzeitigen Anfragen verwendet wird, fügen Sie keine Zuordnungen mehr hinzu, entfernen Sie keine und ändern Sie keine.
Im folgenden Beispiel werden mehrere Dateierweiterungen bekannten MIME-Typen zugeordnet. Die .rtf Erweiterung wird ersetzt und .mp4 entfernt:
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders;
...
// Set up custom content types - associating file extension to MIME type
var provider = new FileExtensionContentTypeProvider();
// Add new mappings
provider.Mappings[".myapp"] = "application/x-msdownload";
provider.Mappings[".htm3"] = "text/html";
provider.Mappings[".image"] = "image/png";
// Replace an existing mapping
provider.Mappings[".rtf"] = "application/x-msdownload";
// Remove MP4 videos
provider.Mappings.Remove(".mp4");
app.UseStaticFiles(new StaticFileOptions
{
ContentTypeProvider = provider
});
Wenn Sie mehrere Konfigurationsoptionen für statische Dateien haben, können Sie den Anbieter alternativ mit StaticFileOptions festlegen:
var provider = new FileExtensionContentTypeProvider();
...
builder.Services.Configure<StaticFileOptions>(options =>
{
options.ContentTypeProvider = provider;
});
app.UseStaticFiles();
In Startup.Configure:
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders;
using System.IO;
...
// Set up custom content types - associating file extension to MIME type
var provider = new FileExtensionContentTypeProvider();
// Add new mappings
provider.Mappings[".myapp"] = "application/x-msdownload";
provider.Mappings[".htm3"] = "text/html";
provider.Mappings[".image"] = "image/png";
// Replace an existing mapping
provider.Mappings[".rtf"] = "application/x-msdownload";
// Remove MP4 videos
provider.Mappings.Remove(".mp4");
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(env.WebRootPath, "images")),
RequestPath = "/images",
ContentTypeProvider = provider
});
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(env.WebRootPath, "images")),
RequestPath = "/images"
});
Weitere Informationen finden Sie unter MIME-Inhaltstypen.
Inhaltstypen, die vom Standard abweichen
Die Middleware für statische Dateien erkennt fast 400 bekannte Dateiinhaltstypen. Wenn der Benutzer eine Datei mit einem unbekannten Dateityp anfordert, übergibt die statische Datei-Middleware die Anforderung an die nächste Middleware in der Pipeline. Wenn keine Middleware die Anforderung verarbeitet, gibt der Server eine Antwort vom Typ 404 Not Found zurück . Wenn das Verzeichnisbrowsen aktiviert ist, zeigt der Server einen Link zur Datei in einer Verzeichnisauflistung an.
Der folgende Code ermöglicht die Bereitstellung unbekannter Inhaltstypen und rendert die unbekannte Datei als Bild:
app.UseStaticFiles(new StaticFileOptions
{
ServeUnknownFileTypes = true,
DefaultContentType = "image/png"
});
Mit dem vorangehenden Code wird eine Anforderung für eine Datei mit unbekanntem Inhaltstyp als Image zurückgegeben.
Warning
Die Aktivierung von ServeUnknownFileTypes stellt ein Sicherheitsrisiko dar. Diese Eigenschaft ist standardmäßig deaktiviert, von einer Verwendung wird abgeraten. Die Zuordnung von Dateierweiterungen zu MIME-Typen bietet eine sicherere Alternative zur Bereitstellung von Dateien mit nicht standardmäßigen Erweiterungen.
Bereitstellen eines benutzerdefinierten Manifests für statische Dateien
Wenn staticAssetsManifestPathnull ist, wird IHostEnvironment.ApplicationName verwendet, um das Manifest zu lokalisieren. Alternativ können Sie einen vollständigen Pfad zur Manifestdatei angeben. Wenn Sie einen relativen Pfad verwenden, sucht das Framework nach der Datei in der AppContext.BaseDirectory.
Sicherheitsüberlegungen für statische Dateien
Warning
UseDirectoryBrowser und UseStaticFiles können Geheimnisse preisgeben. Eine Deaktivierung der Verzeichnissuche in der Produktionsumgebung wird dringend empfohlen. Überprüfen Sie sorgfältig, welche Verzeichnisse über UseStaticFiles oder UseDirectoryBrowser aktiviert wurden. Das gesamte Verzeichnis und die zugehörigen Unterverzeichnisse werden öffentlich zugänglich gemacht. Speichern Sie Dateien, die für eine Bereitstellung in der Öffentlichkeit geeignet sind, in einem dafür vorgesehenen Verzeichnis wie z.B. <content_root>/wwwroot. Trennen Sie diese Dateien von MVC-Ansichten, Razor Pages, Konfigurationsdateien usw.
Die URLs für Inhalte, die über UseDirectoryBrowser und UseStaticFiles verfügbar gemacht werden, richten sich nach der Groß-/Kleinschreibung und den Zeichenbeschränkungen des zugrunde liegenden Dateisystems. Bei Windows wird die Groß-/Kleinschreibung beispielsweise nicht beachtet, jedoch bei macOS und Linux.
In IIS gehostete ASP.NET Core-Apps leiten über das ASP.NET Core-Modul alle Anforderungen an die App weiter, darunter die Anforderungen von statischen Dateien. Der statische IIS-Dateihandler wird nicht verwendet und verarbeitet keine Anforderungen.
Führen Sie im IIS-Manager die folgenden Schritte aus, um den statischen IIS-Dateihandler auf Server- oder Website-Ebene zu entfernen:
- Navigieren Sie zum Feature Module.
- Wählen Sie StaticFileModule aus der Liste aus.
- Klicken Sie in der Randleiste Aktionen auf Entfernen.
Warning
Wenn der statische IIS-Dateihandler aktiviert ist und das ASP.NET Core-Modul falsch konfiguriert wurde, werden statische Dateien bereitgestellt. Diese Bedingung tritt beispielsweise auf, wenn die
web.configDatei nicht bereitgestellt wird.Platzieren Sie Codedateien einschließlich
.csund.cshtmlaußerhalb des Webstammverzeichnisses des App-Projekts. Diese Konfiguration erstellt eine logische Trennung zwischen clientseitigem Inhalt der App und serverbasiertem Code. Diese Trennung verhindert, dass serverseitiger Code verloren geht.
MSBuild-Eigenschaften
In den folgenden Tabellen sind die MSBuild-Eigenschaften und Metadatenbeschreibungen der statischen Dateien dargestellt.
| Eigentum | Description |
|---|---|
EnableDefaultCompressedItems |
Ermöglicht das Einschließen und Ausschließen von Standardkomprimierungsmustern. |
CompressionIncludePatterns |
Durch Semikolons getrennte Liste von Dateimustern, die für die Komprimierung eingeschlossen werden sollen. |
CompressionExcludePatterns |
Durch Semikolons getrennte Liste von Dateimustern, die von der Komprimierung ausgeschlossen werden sollen. Sehen Sie sich das folgende Beispiel an. |
CompressionEnabled |
Deaktiviert die Komprimierung statischer Ressourcen vollständig, wenn sie auf false gesetzt ist. Sehen Sie sich das folgende Beispiel an. |
EnableDefaultCompressionFormats |
Aktiviert Standardkomprimierungsformate (Gzip und Brotli). |
BuildCompressionFormats |
Komprimierungsformate, die während des Builds verwendet werden sollen. |
PublishCompressionFormats |
Komprimierungsformate, die während der Veröffentlichung verwendet werden sollen. |
DisableBuildCompression |
Deaktiviert die Komprimierung während des Builds. |
CompressDiscoveredAssetsDuringBuild |
Komprimiert ermittelte Objekte während des Builds. |
BrotliCompressionLevel |
Komprimierungsebene für den Brotli-Algorithmus. |
StaticWebAssetBuildCompressAllAssets |
Komprimiert alle Ressourcen während des Builds, nicht nur während eines Builds ermittelte oder berechnete Ressourcen. |
StaticWebAssetPublishCompressAllAssets |
Komprimiert alle Ressourcen während der Veröffentlichung, nicht nur die während eines Builds ermittelten oder berechneten Ressourcen. |
Im folgenden Beispiel werden JavaScript-Dateien von der Komprimierung ausgeschlossen:
<PropertyGroup>
<CompressionExcludePatterns>$(CompressionExcludePatterns);**\*.js</CompressionExcludePatterns>
</PropertyGroup>
So deaktivieren Sie die Komprimierung statischer Ressourcen vollständig:
<PropertyGroup>
<CompressionEnabled>false</CompressionEnabled>
</PropertyGroup>
| Eigentum | Description |
|---|---|
StaticWebAssetBasePath |
Basis-URL-Pfad für alle Objekte in einer Bibliothek. |
StaticWebAssetsFingerprintContent |
Aktiviert das Fingerabdrucken von Inhalten für das Cache-Busting. |
StaticWebAssetFingerprintingEnabled |
Aktiviert das Fingerabdruckfeature für statische Webressourcen. |
StaticWebAssetsCacheDefineStaticWebAssetsEnabled |
Aktiviert das Zwischenspeichern für statische Webobjektdefinitionen. |
StaticWebAssetEndpointExclusionPattern |
Muster für das Ausschließen von Endpunkten. |
| Artikelgruppe | Description | Metadaten |
|---|---|---|
StaticWebAssetContentTypeMapping |
Ordnet Dateimuster den Inhaltstypen und Cacheheadern von Endpunkten zu. |
Pattern, CachePriority |
StaticWebAssetFingerprintPattern |
Definiert Muster zum Anwenden von Fingerabdrücken auf statische Webressourcen zum Cache-Busting. |
Pattern, Expression |
Metadatenbeschreibungen:
Pattern: Ein Globmuster, das zum Abgleichen von Dateien verwendet wird. FürStaticWebAssetContentTypeMappingdurchsucht es Dateien, um ihren Inhaltstyp zu bestimmen (zum Beispiel*.jsfür JavaScript-Dateien). FürStaticWebAssetFingerprintPatternidentifiziert es Multierweiterungsdateien, die eine spezielle Fingerabdruckbehandlung erfordern (z. B.*.lib.module.js).Cache: Gibt denCache-ControlHeaderwert für den übereinstimmenen Inhaltstyp an. Dieser Wert steuert das Cache-Verhalten des Browsers (zum Beispielmax-age=3600, must-revalidatefür Mediendateien).Priority: Steuert die Rangfolge, wenn mehrereStaticWebAssetContentTypeMappingElemente mit derselben Datei übereinstimmen. Höhere numerische Werte haben Vorrang vor niedrigeren Werten.Priorityist erforderlich.Expression: Definiert, wie der Fingerabdruck in den Dateinamen eingefügt wird. Der Standardwert ist#[.{FINGERPRINT}], der den Fingerabdruck ({FINGERPRINT}Platzhalter) vor der Erweiterung einfügt.
Im folgenden Beispiel wird das Bitmapdateimuster (.bmp) dem image/bmp-Inhaltstyp zugeordnet, wobei der Platzhalter {CACHE HEADER} den Cache-Control-Header darstellt, der für Endpunkte ohne Fingerabdruck verwendet werden soll.
<ItemGroup>
<StaticWebAssetContentTypeMapping Include="image/bmp" Cache="{CACHE HEADER}"
Pattern="*.bmp" Priority="1" />
</ItemGroup>
Laufzeitkonfigurationsoptionen
In der folgenden Tabelle werden die Laufzeitkonfigurationsoptionen beschrieben.
| Konfigurationsschlüssel | Description |
|---|---|
ReloadStaticAssetsAtRuntime |
Ermöglicht den Hot Reload statischer Ressourcen in der Entwicklungszeit: nutzt veränderte Webstamm-(wwwroot)-Dateien (berechnet ETag neu und komprimiert bei Bedarf neu) anstelle der Manifestversionen in der Buildzeit. Wird standardmäßig nur bei der Bereitstellung eines Buildmanifests aktiviert, es sei denn, es wird explizit festgelegt. |
DisableStaticAssetNotFoundRuntimeFallback |
Bei true wird der Fallbackendpunkt unterdrückt, der neu hinzugefügte Dateien bedient, die nicht im Buildmanifest vorhanden sind. Wenn false oder nicht vorhanden ist, protokolliert ein {**path}-Fallback (GET/HEAD), das auf die Existenz einer Datei prüft, eine Warnung und stellt die Datei mit einem berechneten ETag bereit. |
EnableStaticAssetsDevelopmentCaching |
Bei true werden die ursprünglichen Cache-Control-Header für Ressourcendeskriptoren beibehalten. Wenn false oder nicht vorhanden, werden Cache-Control-Header zu no-cache umgeschrieben, um eine aggressive Clientzwischenspeicherung während der Entwicklung zu vermeiden. |
EnableStaticAssetsDevelopmentIntegrity |
Bei truewerden die Integritätseigenschaften für Ressourcendeskriptoren beibehalten. Wenn false nicht vorhanden ist oder fehlt, werden alle Integritätseigenschaften entfernt, um Konflikte zu verhindern, wenn Dateien während der Entwicklung geändert werden. |