Führen Sie Blazor WASM als Blazor Server-Side aus
HINWEIS : Dies ist ein Beitrag zum Thema "Teilen Sie Ihr Wissen - Fragen und Antworten". Ich habe wahrscheinlich eine Ablehnung bekommen, weil jemand den Kontext dieses Beitrags falsch interpretiert hat :(
Problem
Blazor WASM hätte ohne seine Nachteile in Bezug auf die Entwicklung leicht der Blazor Server-Seite vorgezogen werden können. Derzeit unterstützt Blazor WASM kein Debugging mit vollem Funktionsumfang und hat einen sehr langsamen Start. Dies verlangsamt die Entwicklung erheblich mehr als bei Blazor Server-Side. Obwohl ich ehrlich gesagt persönlich denke, dass das Debuggen die Entwicklung viel mehr verlangsamt als das langsame Starten.
Vorgeschlagene Lösung
HINWEIS: Ich habe das "vorgeschlagene" Wort dort eingefügt, da ich nicht sicher bin, welche Nachteile diese Lösung verursachen kann. Sie können meine Antwort daher gerne unten kommentieren.
Die Lösung besteht darin, einfach ein zusätzliches Blazor Server-Side-Projekt zu erstellen und dann das Blazor WASM-Projekt auf das Blazor Server-Side-Projekt zu verweisen. Fügen Sie anschließend einige Änderungen an der Startupund der _Host.cshtmlBlazor-Serverseite hinzu, um die Blazor WASM-Rasiermesserdateien und die wwwroot-Dateien ordnungsgemäß zu verwenden. In meiner vorgeschlagenen Antwort unten finden Sie eine schrittweise Erklärung für diese Lösung.
Einfacher ausgedrückt, diese Lösung fügt lediglich das Blazor Server-Side-Projekt hinzu und konfiguriert es, ohne dass Änderungen und signifikante Codeduplikationen am Blazor WASM-Projekt vorgenommen werden.
Antworten
HINWEIS: In diesem Beispiel verwende ich Visual Studio 2019 16.7.2 und die Version der Vorlagen befindet sich derzeit in Version 3.1.8
Erstellen Sie ein Blazor WASM-Projekt. Entweder die Option ASP.NET Core Hosted oder Standalone funktioniert einwandfrei, sie haben jedoch später unterschiedliche Konfigurationen, die erläutert werden. Der Rest der Optionen hat keine Auswirkung. In diesem Beispiel werde ich mich mit dem ASP.NET Core Hosted befassen , um später zu erläutern, wie API-Controller vorhanden sind. Erstellen Sie anschließend auch das Blazor Server-Side-Projekt.
Ab diesem Moment sollte Ihre Projektstruktur dem ersten Screenshot unten ähnlich sein.
Löschen Sie die hervorgehobenen Elemente im Blazor Server-Side-Projekt, das im zweiten Screenshot unten gezeigt wird.
Verweisen Sie auf das Blazor WASM-Projekt auf das Blazor Server-Side-Projekt.
- ASP.NET Core Hosted - Verweisen Sie sowohl auf das
BlazorWasm.Client&BlazorWasm.Server-Projekt. - Standalone - Verweisen Sie auf das einzelne Blazor WASM-Projekt wie es ist.
- ASP.NET Core Hosted - Verweisen Sie sowohl auf das
StartupWechseln Sie zur Klasse des Blazor Server-Side-Projekts. In derConfigureServices(), entfernen Sie dieWeatherForecastServicezusammen mit demBlazorServer.DataNamespace dann einen Dienst hinzuzufügen für dasHttpClientdurch den Rasierer Dateien aus dem Blazor wasm Projekt verwendet werden.services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(sp.GetRequiredService<NavigationManager>().BaseUri) });HINWEIS In der Produktion empfehle ich nicht, eine Instanz von zu erstellen
HttpClient. Verwenden SieIHttpClientFactorystattdessen die. Besuchen Sie diesen Artikel Verwenden Sie IHttpClientFactory, um ausfallsichere HTTP-Anforderungen zu implementieren .Für ASP.NET Core WASM-Projekte
In der
Configure(), Karte , um die Endpunkte Controller. Dadurch werden die Controller imX.Server/BlazorWasm.Serverproject verwendet.app.UseEndpoints(endpoints => { endpoints.MapControllers(); ... });
Zur die
_Host.cshtmlin dem / Pages Ordner des Blazor Server-Side - Projektes. Ändern Sie die Referenz voncss/site.cssto,css/app.cssda die Dateinamen für die Haupt-CSS-Datei für das Blazor WASM-Projekt unterschiedlich sind.<link href="css/site.css" rel="stylesheet" /> <!-- Previous --> <link href="css/app.css" rel="stylesheet" /> <!-- New -->
Schließlich ändert sich die
Appin demtypeAttribut descomponentTags und beziehen sich auf dieAppRasierer - Klassendatei im Projekt Blazor wasm. In diesem Beispiel befindet sich dieAppKlasse imBlazorWasm.ClientProjekt:<component type="typeof(App)" render-mode="ServerPrerendered" /> <!-- Previous --> <component type="typeof(BlazorWasm.Client.App)" render-mode="ServerPrerendered" /> <!-- New -->
Das ist es! Wenn Sie das Blazor Server-Side-Projekt ausführen, sollte es ohne den Text "Loading ..." geladen werden.
- Es wurden keine Änderungen an den Blazor WASM-Projekten vorgenommen und keine signifikanten Codeduplikationen vorgenommen.
- Die einzigen Dinge, die geändert werden müssen, sind die Referenzen und das
launchSettings.json&appsettings.json. - Für die Konfigurationen in der
StartupBlazor Server-Side können Sie einfach Erweiterungsmethoden in den Blazor WASM-Projekten erstellen und diese im Blazor Server-Side-Projekt verwenden.
HINWEIS: Ich denke ehrlich, dass dies ideal (?) Nur zum Debuggen während der Entwicklung ist, da die WASM-Rasiererdateien die Fähigkeit einer echten Blazor-Serverseite nicht vollständig nutzen, da sie weiterhin HTTP-Anforderungen verwenden würden.
Ich hoffe auf Feedback unten! : DD