Freigeben über


Hosten und Bereitstellen von ASP.NET Core Blazor WebAssembly

Hinweis

Dies ist nicht die neueste Version dieses Artikels. Informationen zum aktuellen Release finden Sie in der .NET 9-Version dieses Artikels.

Warnung

Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie in der .NET- und .NET Core-Supportrichtlinie. Informationen zum aktuellen Release finden Sie in der .NET 9-Version dieses Artikels.

Von großer Bedeutung

Diese Informationen beziehen sich auf ein Vorabversionsprodukt, das vor der kommerziellen Freigabe möglicherweise noch wesentlichen Änderungen unterliegt. Microsoft gibt keine Garantie, weder ausdrücklich noch impliziert, hinsichtlich der hier bereitgestellten Informationen.

Informationen zum aktuellen Release finden Sie in der .NET 9-Version dieses Artikels.

In diesem Artikel wird erläutert, wie Sie Blazor WebAssembly-Apps hosten und bereitstellen.

Mit dem Blazor WebAssembly-Hostingmodell:

  • Die Blazor-App, ihre Abhängigkeiten und die .NET-Runtime werden parallel im Browser heruntergeladen.
  • Die App wird direkt im UI-Thread des Browsers ausgeführt.

Dieser Artikel gilt für das Bereitstellungsszenario, in dem die Blazor-App sich auf einem Webserver oder Webservice für statisches Hosting befindet, und .NET nicht zur Unterstützung der Blazor-App verwendet wird. Diese Strategie wird im Abschnitt "Eigenständige Bereitstellung " und anderen Artikeln in diesem Knoten für IIS, Azure-Dienste, Apache, Nginx und GitHub-Seiten behandelt.

Die folgenden Bereitstellungsstrategien werden unterstützt:

  • Die Blazor-App wird von einer ASP.NET Core-App unterstützt. Diese Strategie wird im Abschnitt Gehostete Bereitstellung mit ASP.NET Core behandelt.
  • Die Blazor-App wird auf einem Webserver oder Webservice für statisches Hosting abgelegt, auf dem .NET nicht zur Unterstützung der Blazor-App verwendet wird. Diese Strategie wird im Abschnitt Eigenständige Bereitstellung behandelt, der Informationen zum Hosten einer Blazor WebAssembly-App als untergeordnete IIS-App enthält.
  • Eine ASP.NET Core App hostet mehrere Blazor WebAssembly Apps. Weitere Informationen finden Sie unter Mehrere gehostete ASP.NET Core Blazor WebAssembly-Apps.

Hosten von Unterdomänen und IIS-Unteranwendungen

Für das Unterdomänenhosting ist keine spezielle Konfiguration der App erforderlich. Sie müssen nicht den App-Basispfad (das <base>-Tag in wwwroot/index.html) konfigurieren, um die App in einer Unterdomäne zu hosten.

Für das IIS-Unteranwendungshosting müssen Sie den App-Basispfad festlegen. Weitere Informationen und Links zu weiteren Leitfäden zum IIS-Unteranwendungshosting finden Sie unter Hosten und Bereitstellen mit ASP.NET Core Blazor.

Verringern der maximalen Heapgröße für Browser auf einigen mobilen Geräten

Beim Erstellen einer Blazor-App, die auf dem Client (.Client-Projekt einer Blazor Web App oder einer eigenständigen Blazor WebAssembly-App) ausgeführt wird und auf Browser mobiler Geräte ausgerichtet ist (insbesondere Safari unter iOS), kann es erforderlich sein, den maximalen Arbeitsspeicher für die App mit der MSBuild-Eigenschaft EmccMaximumHeapSize zu reduzieren. Der Standardwert von 2.147.483.648 Byte ist möglicherweise zu groß und könnte zu einem Absturz der App führen, wenn diese versucht, mehr Arbeitsspeicher zuzuweisen, und der Browser dies nicht durchführt. Im folgenden Beispiel wird der Wert in der Datei Program auf 268.435.456 Byte festgelegt:

Beim Erstellen einer Blazor WebAssembly-App, die auf Browser mobiler Geräte ausgerichtet ist (insbesondere Safari unter iOS), kann es erforderlich sein, den maximalen Arbeitsspeicher für die App mit der MSBuild-Eigenschaft EmccMaximumHeapSize zu reduzieren. Der Standardwert von 2.147.483.648 Byte ist möglicherweise zu groß und könnte zu einem Absturz der App führen, wenn diese versucht, mehr Arbeitsspeicher zuzuweisen, und der Browser dies nicht durchführt. Im folgenden Beispiel wird der Wert in der Datei Program auf 268.435.456 Byte festgelegt:

<EmccMaximumHeapSize>268435456</EmccMaximumHeapSize>

Weitere Informationen zu Mono-/WebAssembly-MSBuild-Eigenschaften und -Zielen finden Sie unter WasmApp.Common.targets (im GitHub-Repository dotnet/runtime).

Webcil-Verpackungsformat für .NET-Assemblies

Webcil ist ein webfreundliches Paketformat für .NET-Assemblys, das die Verwendung von Blazor WebAssembly in restriktiven Netzwerkumgebungen ermöglicht. Webcil-Dateien verwenden einen standardmäßigen WebAssembly-Wrapper, bei dem die Assemblys als WebAssembly-Dateien bereitgestellt werden, die die Standarddateierweiterung .wasm verwenden.

Webcil ist das Standardpaketformat, wenn Sie eine Blazor WebAssembly-App veröffentlichen. Um die Verwendung von Webcil zu deaktivieren, legen Sie die folgende MS Build-Eigenschaft in der Projektdatei der App fest:

<PropertyGroup>
  <WasmEnableWebcil>false</WasmEnableWebcil>
</PropertyGroup>

Anpassen, wie Startressourcen geladen werden

Passen Sie an, wie Startressourcen mithilfe der loadBootResource-API geladen werden. Weitere Informationen finden Sie unter Starten von ASP.NET CoreBlazor.

Komprimierung

Wenn eine Blazor WebAssembly-App veröffentlicht wird, wird die Ausgabe bei der Veröffentlichung statisch komprimiert, um die App-Größe zu verringern und den Aufwand für eine Laufzeitkomprimierung zu beseitigen. Die folgenden Komprimierungsalgorithmen werden verwendet:

Blazor stützt sich darauf, dass der Host die entsprechenden komprimierten Dateien bereitstellt. Beim Hosten einer eigenständigen Blazor WebAssembly-App sind möglicherweise zusätzliche Schritte erforderlich, um sicherzustellen, dass die statisch komprimierten Dateien bereitgestellt werden:

Blazor stützt sich darauf, dass der Host die entsprechenden komprimierten Dateien bereitstellt. Wenn Sie ein in ASP.NET Core gehostetesBlazor WebAssembly Projekt verwenden, kann das Hostprojekt die Inhaltsaushandlung durchführen und die statisch komprimierten Dateien bereitstellen. Beim Hosten einer eigenständigen Blazor WebAssembly-App sind möglicherweise zusätzliche Schritte erforderlich, um sicherzustellen, dass die statisch komprimierten Dateien bereitgestellt werden:

  • Informationen zur Komprimierungskonfiguration der Datei web.config von IIS finden Sie im Abschnitt IIS: Brotli- und Gzip-Komprimierung.
  • Beim Hosten über statische Hostinglösungen, die die Inhaltsaushandlung für statisch komprimierte Dateien nicht unterstützen, sollten Sie die App so konfigurieren, dass sie die in das Brotli-Format komprimierten Dateien abruft und decodiert:

Rufen Sie den JavaScript Brotli-Decoder aus dem GitHub-Repository google/brotli ab. Die verkleinerte Decoderdatei heißt decode.min.js und befindet sich im Ordner js des Repositorys.

Hinweis

Wenn die verkleinerte Version des decode.js-Skripts (decode.min.js) fehlschlägt, sollten Sie stattdessen versuchen, die nicht verkleinerte Version (decode.js) zu verwenden.

Aktualisieren Sie die App zur Verwendung des Decoders.

Legen Sie wwwroot/index.html in der autostartDatei im false-Tag von Blazor auf <script> fest:

<script src="_framework/blazor.webassembly.js" autostart="false"></script>

Fügen Sie nach dem Blazor-Tag von <script> und vor dem schließenden </body>-Tag den folgenden JavaScript-<script>-Codeblock hinzu. Die folgende Funktion ruft fetch mit cache: 'no-cache' auf, um den Cache des Browsers auf dem neuesten Stand zu halten.

Blazor Web App:

<script type="module">
  import { BrotliDecode } from './decode.min.js';
  Blazor.start({
    webAssembly: {
      loadBootResource: function (type, name, defaultUri, integrity) {
        if (type !== 'dotnetjs' && location.hostname !== 'localhost' && type !== 'configuration' && type !== 'manifest') {
          return (async function () {
            const response = await fetch(defaultUri + '.br', { cache: 'no-cache' });
            if (!response.ok) {
              throw new Error(response.statusText);
            }
            const originalResponseBuffer = await response.arrayBuffer();
            const originalResponseArray = new Int8Array(originalResponseBuffer);
            const decompressedResponseArray = BrotliDecode(originalResponseArray);
            const contentType = type === 
              'dotnetwasm' ? 'application/wasm' : 'application/octet-stream';
            return new Response(decompressedResponseArray, 
              { headers: { 'content-type': contentType } });
          })();
        }
      }
    }
  });
</script>

Blazor WebAssembly eigenständig:

<script type="module">
  import { BrotliDecode } from './decode.min.js';
  Blazor.start({
    loadBootResource: function (type, name, defaultUri, integrity) {
      if (type !== 'dotnetjs' && location.hostname !== 'localhost' && type !== 'configuration') {
        return (async function () {
          const response = await fetch(defaultUri + '.br', { cache: 'no-cache' });
          if (!response.ok) {
            throw new Error(response.statusText);
          }
          const originalResponseBuffer = await response.arrayBuffer();
          const originalResponseArray = new Int8Array(originalResponseBuffer);
          const decompressedResponseArray = BrotliDecode(originalResponseArray);
          const contentType = type === 
            'dotnetwasm' ? 'application/wasm' : 'application/octet-stream';
          return new Response(decompressedResponseArray, 
            { headers: { 'content-type': contentType } });
        })();
      }
    }
  });
</script>

Weitere Informationen zum Laden von Startressourcen finden Sie unter Starten von ASP.NET CoreBlazor.

Um die Komprimierung zu deaktivieren, fügen Sie der Projektdatei der App die CompressionEnabled MSBuild-Eigenschaft hinzu, und setzen Sie den Wert auf false:

<PropertyGroup>
  <CompressionEnabled>false</CompressionEnabled>
</PropertyGroup>

Die CompressionEnabled-Eigenschaft kann an den dotnet publish-Befehl mit der folgenden Syntax in einer Befehlsshell übergeben werden:

dotnet publish -p:CompressionEnabled=false

Um die Komprimierung zu deaktivieren, fügen Sie der Projektdatei der App die BlazorEnableCompression MSBuild-Eigenschaft hinzu, und setzen Sie den Wert auf false:

<PropertyGroup>
  <BlazorEnableCompression>false</BlazorEnableCompression>
</PropertyGroup>

Die BlazorEnableCompression-Eigenschaft kann an den dotnet publish-Befehl mit der folgenden Syntax in einer Befehlsshell übergeben werden:

dotnet publish -p:BlazorEnableCompression=false

Neu Schreiben von URLs für korrektes Routing

Routinganforderungen für Seitenkomponenten in einer Blazor WebAssembly-App sind nicht so unkompliziert wie Routinganforderungen in einer Blazor Server-App. Betrachten wir eine Blazor WebAssembly-App mit zwei Komponenten:

  • Main.razor: Wird im Stammverzeichnis der App geladen und enthält einen Link zur About-Komponente (href="About").
  • About.razor: About-Komponente.

Wenn das Standarddokument der App über die Adressleiste des Browsers (z. B. https://www.contoso.com/) angefordert wird, geschieht Folgendes:

  1. Der Browser sendet eine Anforderung.
  2. Die Standardseite wird zurückgegeben, in der Regel index.html.
  3. index.html initialisiert die App.
  4. Die Router-Komponente wird geladen, und die RazorMain-Komponente wird gerendert.

Auf der Seite „Main“ kann der Link zur About-Komponente auf dem Client ausgewählt werden, da der Blazor-Router dafür sorgt, dass der Browser im Internet keine Anforderung für www.contoso.com an About sendet, und stattdessen die gerenderte About-Komponente selbst bereitstellt. Alle Anforderungen von internen Endpunkten innerhalb der Blazor WebAssembly-App funktionieren auf dieselbe Weise: Durch Anforderungen werden keine browserbasierten Anforderungen an serverseitig gehostete Ressourcen im Internet ausgelöst. Der Router verarbeitet Anforderungen intern.

Wenn eine Anforderung für www.contoso.com/About über die Adressleiste des Browsers gesendet wird, tritt bei der Anforderung ein Fehler auf. Diese Ressource ist im Internethost der App nicht vorhanden. Daher wird die Antwort 404 Nicht gefunden zurückgegeben.

Da Browser Anforderungen für clientseitige Seiten an internetbasierte Hosts senden, müssen Webserver und Hostingdienste alle Anforderungen für Ressourcen, die sich nicht physisch auf dem Server befinden, auf der Seite index.html erneut generieren. Wenn index.html zurückgegeben wird, übernimmt der Blazor-Router der App und antwortet mit der richtigen Ressource.

Wenn Sie die Bereitstellung auf einem IIS-Server durchführen, können Sie das URL-Rewrite-Modul mit der veröffentlichten web.config-Datei der App verwenden. Weitere Informationen finden Sie unter Hosten und Bereitstellen von ASP.NET Core Blazor WebAssembly mit IIS.

Gehostete Bereitstellung mit ASP.NET Core

Mit einer gehosteten Bereitstellung wird die Blazor WebAssembly-App über eine auf einem Webserver ausgeführte ASP.NET Core-App für Browser bereitgestellt.

Die Blazor WebAssembly-Client-App wird im Ordner /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot der Server-App zusammen mit allen anderen statischen Webressourcen der Server-App veröffentlicht. Die beiden Apps werden zusammen bereitgestellt. Hierfür wird ein Webserver benötigt, auf dem eine ASP.NET Core-App gehostet werden kann. Bei einer gehosteten Bereitstellung enthält Visual Studio die Blazor WebAssembly-App-Projektvorlage (blazorwasm-Vorlage bei Verwendung des Befehls dotnet new) mit der ausgewählten Option Hosted (-ho|--hosted, wenn Sie den Befehl dotnet new verwenden).

Weitere Informationen finden Sie in den folgenden Artikeln:

Gehostete Bereitstellung einer frameworkabhängigen ausführbaren Datei für eine bestimmte Plattform

Um eine gehostete Blazor WebAssembly-App als frameworkabhängige ausführbare Datei für eine bestimmte Plattform (nicht eigenständig) bereitzustellen, befolgen Sie die folgende Anleitung für die verwendeten Tools.

Visuelles Studio

Eine selbstständige Bereitstellung wird für ein generiertes Veröffentlichungsprofil konfiguriert (.pubxml). Vergewissern Sie sich, dass das Veröffentlichungsprofil des Server-Projekts die auf <SelfContained> festgelegte MSBuild-Eigenschaft false enthält.

In der Veröffentlichungsprofildatei .pubxml im Ordner Server des Properties-Projekts:

<SelfContained>false</SelfContained>

Legen Sie die Runtime-ID (RID) mithilfe der Einstellung Zielruntime im Bereich Einstellungen der Benutzeroberfläche Veröffentlichen fest, wodurch die MSBuild-Eigenschaft <RuntimeIdentifier> im Veröffentlichungsprofil generiert wird:

<RuntimeIdentifier>{RID}</RuntimeIdentifier>

In der vorherigen Konfiguration steht der Platzhalter {RID} für die Runtime-ID (RID).

Veröffentlichen Sie das Server-Projekt in der Konfiguration Release.

Hinweis

Es ist möglich, eine App mit Veröffentlichungsprofileinstellungen mithilfe der .NET-CLI zu veröffentlichen, indem Sie /p:PublishProfile={PROFILE} an den Befehl dotnet publish übergeben, wobei {PROFILE} der Platzhalter für das Profil ist. Weitere Informationen finden Sie in den Abschnitten Veröffentlichungsprofile und Beispiel für Ordnerveröffentlichung im Artikel Visual Studio-Veröffentlichungsprofile (PUBXML) für die Bereitstellung von ASP.NET Core-Apps. Wenn Sie die RID im dotnet publish-Befehl und nicht im Veröffentlichungsprofil übergeben, verwenden Sie die MSBuild-Eigenschaft (/p:RuntimeIdentifier) mit dem Befehl, nicht mit der Option -r|--runtime.

.NET CLI

Konfigurieren Sie eine eigenständige Bereitstellung, indem Sie die MSBuild-Eigenschaft <SelfContained> in ein <PropertyGroup>-Element der Server-Projektdatei einfügen und auf false festlegen:

<SelfContained>false</SelfContained>

Von großer Bedeutung

Die Eigenschaft SelfContained muss in die Projektdatei des Server-Projekts eingefügt werden. Die Eigenschaft kann mit dem Befehl dotnet publish nicht ordnungsgemäß festgelegt werden, wenn die Option --no-self-contained oder die MSBuild-Eigenschaft /p:SelfContained=false verwendet wird.

Legen Sie die Runtime-ID (RID) mit einem der folgenden Ansätze fest:

  • Option 1: Festlegen der RID in einem <PropertyGroup>-Element in der Projektdatei des Server-Projekts:

    <RuntimeIdentifier>{RID}</RuntimeIdentifier>
    

    In der vorherigen Konfiguration steht der Platzhalter {RID} für die Runtime-ID (RID).

    Veröffentlichen Sie die App in der Konfiguration „Release“ aus dem Server-Projekt.

    dotnet publish -c Release
    
  • Option 2: Übergeben Sie die RID im dotnet publish-Befehl als Eigenschaft von MSBuild (/p:RuntimeIdentifier), nicht mit der Option -r|--runtime:

    dotnet publish -c Release /p:RuntimeIdentifier={RID}
    

    Im vorherigen Befehl steht der Platzhalter {RID} für die Runtime-ID (RID).

Weitere Informationen finden Sie in den folgenden Artikeln:

Eigenständige Bereitstellung

Bei einer eigenständigen Bereitstellung wird die Blazor WebAssembly-App in Form von statischen Dateien bereitgestellt, die von Clients direkt angefordert werden. Jeder Server für statische Dateien kann die Blazor-App bedienen.

Eigenständige Bereitstellungsressourcen werden entweder im /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot-Ordner oder im bin/Release/{TARGET FRAMEWORK}/browser-wasm/publish-Ordner veröffentlicht, wobei der {TARGET FRAMEWORK}-Platzhalter das Ziel-Framework ist.

Azure App Service

Blazor WebAssembly Apps können in Azure App Services unter Windows bereitgestellt werden, die die App in IIS hosten.

Die Bereitstellung einer eigenständigen Blazor WebAssembly-App in Azure App Service für Linux wird derzeit nicht unterstützt. Wir empfehlen, eine eigenständige Blazor WebAssembly App mit Azure Static Web Apps zu hosten, was dieses Szenario unterstützt.

Eigenständig mit Docker

Eine eigenständige Blazor WebAssembly-App wird als Satz statischer Dateien für das Hosting durch einen statischen Dateiserver veröffentlicht.

So hosten Sie die App in Docker

  • Wählen Sie einen Docker-Container mit Webserverunterstützung aus, z. B. Nginx oder Apache.
  • Kopieren Sie die Ressourcen im Ordner publish in einen Ordner, der auf dem Webserver für die Bereitstellung statischer Dateien definiert ist.
  • Wenden Sie nach Bedarf zusätzliche Konfiguration für die Blazor WebAssembly-App an.

Einen Leitfaden zur Konfiguration finden Sie in den folgenden Ressourcen:

Hostkonfigurationswerte

Blazor WebAssembly-Apps können die folgenden Hostkonfigurationswerte als Befehlszeilenargumente während der Laufzeit in Entwicklungsumgebungen akzeptieren.

Inhaltsstammverzeichnis

Mit dem Argument --contentroot wird der absolute Pfad zum Verzeichnis festgelegt, das die Inhaltsdateien (das Inhaltsstammverzeichnis) der App enthält. In den folgenden Beispielen ist /content-root-path der Stammpfad für Inhalte der App.

  • Geben Sie das Argument beim lokalen Ausführen der App in einer Eingabeaufforderung ein. Führen Sie den folgenden Befehl über das Verzeichnis der App aus:

    dotnet watch --contentroot=/content-root-path
    
  • Fügen Sie der Datei launchSettings.json der App im Profil IIS Express einen Eintrag hinzu. Diese Einstellung wird verwendet, wenn die Anwendung mit dem Visual Studio-Debugger und von einer Eingabeaufforderung aus mit dotnet watch (oder dotnet run) ausgeführt wird.

    "commandLineArgs": "--contentroot=/content-root-path"
    
  • Geben Sie in Visual Studio das Argument in Eigenschaften>Debuggen>Anwendungsargumente ein. Wenn Sie das Argument auf der Visual Studio-Eigenschaftenseite festlegen, wird das Argument der Datei launchSettings.json hinzugefügt.

    --contentroot=/content-root-path
    

Basispfad

Mit dem Argument --pathbase wird der Basispfad für eine App festgelegt, die lokal mit einem relativen URL-Pfad ausgeführt wird, der sich nicht im Stammverzeichnis befindet (d. h. das <base>-Tag href wird für das Staging und die Produktion auf einen anderen Pfad als / festgelegt). In den folgenden Beispielen ist /relative-URL-path die Pfadbasis der App. Weitere Informationen finden Sie unter ASP.NET Core-App-BasispfadBlazor.

Von großer Bedeutung

Im Gegensatz zu dem Pfad, der für href des <base>-Tags bereitgestellt wird, wird beim Übergeben des /-Argumentwerts kein Schrägstrich (--pathbase) nachgestellt. Wenn der Basispfad einer App im <base>-Tag als <base href="/CoolApp/"> (mit nachgestelltem Schrägstrich) bereitgestellt wird, wird der Argumentwert in der Befehlszeile als --pathbase=/CoolApp (ohne nachgestellten Schrägstrich) übergeben.

  • Geben Sie das Argument beim lokalen Ausführen der App in einer Eingabeaufforderung ein. Führen Sie den folgenden Befehl über das Verzeichnis der App aus:

    dotnet watch --pathbase=/relative-URL-path
    
  • Fügen Sie der Datei launchSettings.json der App im Profil IIS Express einen Eintrag hinzu. Diese Einstellung wird verwendet, wenn die App mit dem Visual Studio-Debugger und von einer Eingabeaufforderung mit dotnet watch (oder dotnet run) ausgeführt wird.

    "commandLineArgs": "--pathbase=/relative-URL-path"
    
  • Geben Sie in Visual Studio das Argument in Eigenschaften>Debuggen>Anwendungsargumente ein. Wenn Sie das Argument auf der Visual Studio-Eigenschaftenseite festlegen, wird das Argument der Datei launchSettings.json hinzugefügt.

    --pathbase=/relative-URL-path
    

Weitere Informationen finden Sie unter ASP.NET Core-App-BasispfadBlazor.

URLs

Mit dem Argument --urls werden die IP- oder Hostadressen zusammen mit Ports und Protokollen festgelegt, auf denen Anfragen entgegengenommen werden sollen.

  • Geben Sie das Argument beim lokalen Ausführen der App in einer Eingabeaufforderung ein. Führen Sie den folgenden Befehl über das Verzeichnis der App aus:

    dotnet watch --urls=http://127.0.0.1:0
    
  • Fügen Sie der Datei launchSettings.json der App im Profil IIS Express einen Eintrag hinzu. Diese Einstellung wird verwendet, wenn die App mit dem Visual Studio-Debugger und von einer Eingabeaufforderung mit dotnet watch (oder dotnet run) ausgeführt wird.

    "commandLineArgs": "--urls=http://127.0.0.1:0"
    
  • Geben Sie in Visual Studio das Argument in Eigenschaften>Debuggen>Anwendungsargumente ein. Wenn Sie das Argument auf der Visual Studio-Eigenschaftenseite festlegen, wird das Argument der Datei launchSettings.json hinzugefügt.

    --urls=http://127.0.0.1:0
    

Konfigurieren des Trimmers

Blazor führt bei jedem Release-Build eine IL-Trimmung (Intermediate Language) durch, um nicht benötigte IL aus den Ausgabe-Assemblys zu entfernen. Weitere Informationen finden Sie unter Konfigurieren des Trimmers für Blazor in ASP.NET Core.

Konfigurieren des Linkers

Blazor führt auf jedem Releasebuild eine IL-Verknüpfung (Intermediate Language, Zwischensprache) durch, um nicht benötigte Zwischensprache aus den Ausgabeassemblys zu entfernen. Weitere Informationen finden Sie unter Konfigurieren des Linkers für ASP.NET CoreBlazor.

Ändern der Dateinamenerweiterung von DLL-Dateien

Dieser Abschnitt bezieht sich auf .NET 5 bis .NET 7. In .NET 8 oder höher werden .NET-Assemblys mithilfe des Webcil-Dateiformats als WebAssembly-Dateien (.wasm) bereitgestellt.

Wenn eine Firewall, ein Antivirenprogramm oder eine Netzwerksicherheitsappliance die Übertragung der DLL-Dateien (.dll, Dynamic Link Library) der App blockiert, können Sie die Anleitung in diesem Abschnitt befolgen, um die Dateinamenerweiterungen der veröffentlichten DLL-Dateien der App zu ändern.

Das Ändern der Dateinamenerweiterungen der DLL-Dateien der App löst das Problem möglicherweise nicht, da viele Sicherheitssysteme den Inhalt der Dateien der App und nicht nur Dateierweiterungen überprüfen.

Für einen robusteren Ansatz in Umgebungen, die den Download und die Ausführung von DLL-Dateien blockieren, führen Sie einen der folgenden Ansätze aus:

  • Verwenden Sie .NET 8 oder höher, die .NET-Assemblys als WebAssembly-Dateien (.wasm) mithilfe des Webcil-Dateiformats packen. Weitere Informationen finden Sie im Abschnitt zum Packen von Webcils für .NET-Assemblys in einer .NET 8- oder höher-Version dieses Artikels.
  • Verwenden Sie in .NET 6 oder höher ein benutzerdefiniertes Bereitstellungslayout.

Es gibt Ansätze von Drittanbietern, dieses Problem zu lösen. Weitere Informationen finden Sie in den Ressourcen unter Awesome Blazor.

Verwenden Sie nach Veröffentlichen der App ein Shellskript oder eine DevOps-Buildpipeline, um .dll-Dateien umzubenennen, damit sie eine andere Dateierweiterung im Verzeichnis der von der App veröffentlichten Ausgabe verwenden.

In den folgenden Beispielen:

  • Zum Aktualisieren der Dateierweiterungen wird PowerShell (PS) verwendet.
  • .dll Dateien werden umbenannt, um die .bin Dateierweiterung aus der Befehlszeile zu verwenden.
  • Dateien, die im veröffentlichten Blazor Startmanifest mit einer .dll Dateierweiterung aufgeführt sind, werden auf die .bin Dateierweiterung aktualisiert.
  • Wenn auch Service-Worker-Ressourcen verwendet werden, aktualisiert ein PowerShell-Befehl die .dll Dateien, welche in der service-worker-assets.js Datei aufgelistet sind, auf die .bin Dateierweiterung.

Um eine andere Dateierweiterung als .bin zu verwenden, ersetzen Sie .bin in den folgenden Befehlen mit der gewünschten Dateierweiterung.

In den folgenden Befehlen ist der Platzhalter der {PATH} Pfad zum veröffentlichten _framework Ordner im publish Ordner.

Umbenennen von Dateierweiterungen im Ordner:

dir {PATH} | rename-item -NewName { $_.name -replace ".dll\b",".bin" }

Umbenennen von Dateierweiterungen in der blazor.boot.json Datei:

((Get-Content {PATH}\blazor.boot.json -Raw) -replace '.dll"','.bin"') | Set-Content {PATH}\blazor.boot.json

Wenn Service Worker-Ressourcen ebenfalls verwendet werden, da es sich bei der App um eine Progressive Web App (PWA) handelt:

((Get-Content {PATH}\service-worker-assets.js -Raw) -replace '.dll"','.bin"') | Set-Content {PATH}\service-worker-assets.js

Der {PATH} Platzhalter ist im vorherigen Befehl der Pfad zur veröffentlichten service-worker-assets.js Datei.

Um die komprimierte blazor.boot.json Datei zu adressieren, übernehmen Sie eine der folgenden Ansätze:

  • Komprimieren Sie die aktualisierte blazor.boot.json-Datei erneut und erzeugen Sie neue blazor.boot.json.gz- und blazor.boot.json.br-Dateien. (Empfohlen)
  • Entfernen Sie die komprimierten Dateien blazor.boot.json.gz und blazor.boot.json.br. (Die Komprimierung ist mit diesem Ansatz deaktiviert.)

Für die komprimierte Datei einer Progressive Web App (PWA) wählen Sie einen der folgenden Ansätze:

  • Komprimieren Sie die aktualisierte service-worker-assets.js-Datei erneut und erzeugen Sie neue service-worker-assets.js.br- und service-worker-assets.js.gz-Dateien. (Empfohlen)
  • Entfernen Sie die komprimierten Dateien service-worker-assets.js.gz und service-worker-assets.js.br. (Die Komprimierung ist mit diesem Ansatz deaktiviert.)

Um die Erweiterungsänderung unter Windows in .NET 6/7 zu automatisieren, verwendet der folgende Ansatz ein PowerShell-Skript, das sich im Stammverzeichnis des Projekts befindet. Das folgende Skript, das die Komprimierung deaktiviert, ist die Grundlage für weitere Änderungen, wenn Sie die blazor.boot.json Datei und service-worker-assets.js Datei erneut komprimieren möchten, wenn es sich bei der App um eine Progressive Web App (PWA) handelt. Der Pfad zum publish Ordner wird beim Ausführen an das Skript übergeben.

ChangeDLLExtensions.ps1::

param([string]$filepath)
dir $filepath\wwwroot\_framework | rename-item -NewName { $_.name -replace ".dll\b",".bin" }
((Get-Content $filepath\wwwroot\_framework\blazor.boot.json -Raw) -replace '.dll"','.bin"') | Set-Content $filepath\wwwroot\_framework\blazor.boot.json
Remove-Item $filepath\wwwroot\_framework\blazor.boot.json.gz
Remove-Item $filepath\wwwroot\_framework\blazor.boot.json.br

Wenn die Ressourcen von Service Workern ebenfalls verwendet werden, weil es sich bei der App um eine Progressive Web App (PWA) handelt, fügen Sie die folgenden Befehle hinzu:

((Get-Content $filepath\wwwroot\service-worker-assets.js -Raw) -replace '.dll"','.bin"') | Set-Content $filepath\wwwroot\service-worker-assets.js
Remove-Item $filepath\wwwroot\service-worker-assets.js.gz
Remove-Item $filepath\wwwroot\service-worker-assets.js.br

In der Projektdatei wird das Skript nach Veröffentlichung der App für die Release Konfiguration ausgeführt:

<Target Name="ChangeDLLFileExtensions" AfterTargets="AfterPublish" Condition="'$(Configuration)'=='Release'">
  <Exec Command="powershell.exe -command &quot;&amp; {.\ChangeDLLExtensions.ps1 '$(SolutionDir)'}&quot;" />
</Target>

Nachdem Sie die App veröffentlicht haben, komprimieren Sie blazor.boot.json und service-worker-assets.js, falls verwendet, manuell erneut, um die Komprimierung wieder zu aktivieren.

Hinweis

Wenn Sie dieselben Assemblys umbenennen und verzögert laden, lesen Sie die Anleitung unter Verzögertes Laden von Assemblys in Blazor WebAssembly in ASP.NET Core.

Normalerweise erfordert der Server der App die Konfiguration einer statischen Ressource, um den Dateien die aktualisierte Erweiterung bereitzustellen. Für eine von IIS gehostete App fügen Sie in einer benutzerdefinierten Datei <mimeMap> im Abschnitt mit statischem Inhalt (<staticContent>) einen MIME-Zuordnungseintrag (web.config) für die neue Dateierweiterung hinzu. Im folgenden Beispiel wird davon ausgegangen, dass die Dateierweiterung von .dll in .bin geändert wird:

<staticContent>
  ...
  <mimeMap fileExtension=".bin" mimeType="application/octet-stream" />
  ...
</staticContent>

Schließen Sie ein Update für komprimierte Dateien ein, wenn eine Komprimierung verwendet wird:

<mimeMap fileExtension=".bin.br" mimeType="application/octet-stream" />
<mimeMap fileExtension=".bin.gz" mimeType="application/octet-stream" />

Entfernen Sie den Eintrag für die Dateierweiterung .dll:

- <mimeMap fileExtension=".dll" mimeType="application/octet-stream" />

Entfernen Sie die Einträge für komprimierte .dll-Dateien, wenn eine Komprimierung verwendet wird:

- <mimeMap fileExtension=".dll.br" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".dll.gz" mimeType="application/octet-stream" />

Weitere Informationen zu benutzerdefinierten web.config Dateien finden Sie unter Verwendung eines benutzerdefinierten web.config Abschnitts.

Beschädigung durch Dateien aus einer früheren Bereitstellung

Typisch bei Bereitstellungen:

  • Nur die geänderten Dateien werden ersetzt, was in der Regel zu einer schnelleren Bereitstellung führt.
  • Vorhandene Dateien, die nicht Teil der neuen Bereitstellung sind, bleiben für die Verwendung durch die neue Bereitstellung erhalten.

In seltenen Fällen kann eine neue Bereitstellung durch veraltete Dateien aus einer vorherigen Bereitstellung beschädigt werden. Wenn Sie die vorhandene Bereitstellung (oder die lokal veröffentlichte App vor der Bereitstellung) vollständig löschen, wird das Problem mit einer beschädigten Bereitstellung möglicherweise behoben. Häufig reicht es aus, die vorhandene Bereitstellung einmal zu löschen, um das Problem auch bei einer DevOps-Build- und -Bereitstellungspipeline zu beheben.

Wenn Sie feststellen, dass das Löschen einer vorherigen Bereitstellung immer erforderlich ist, wenn eine DevOps-Build- und -Bereitstellungspipeline verwendet wird, können Sie der Buildpipeline vorübergehend einen Schritt hinzufügen, um die vorherige Bereitstellung für jede neue Bereitstellung zu löschen, bis Sie die genaue Ursache der Beschädigung behoben haben.