Interactivité Switch Blazor
Passer d’un mode d’interactivité à un autre projet existant de Power Portals Pro consiste en une série de modifications sur Program.cs, App.razor, le .Client projet, et (en ajoutant l’interactivité) les pages de compte. Le cadre lui-même n’a pas besoin de modifications — seul le câblage de l’hôte en a besoin. Les étapes ci-dessous couvrent les transitions courantes.
Conseil
Si vos personnalisations se trouvent sur un petit nombre de pages, la solution la plus faible est d’échaffrager un projet neuf en mode cible et de copier vos personnalisations. Comparer votre hôte actuel à une référence fraîchement générée est aussi utile pour rechercher une divergence après un changement manuel.
dotnet new powerportalspro -o MyPortal-Reference --interactivity Auto
Serveur → WebAssembly ou Auto
Ces étapes ajoutent WebAssembly à un hôte serveur uniquement. Les mêmes modifications s’appliquent que vous ciblez uniquement WebAssembly ou Auto — les seules différences sont les méthodes de construction que vous chaînez Program.cs et quels modes App.razor de rendu reviennent. Les deux sont signalés à chaque étape.
1. Convertir le . Projet client vers une application WebAssembly
Ouvrez .Client/MyApp.Client.csproj et changez le SDK de Microsoft.NET.Sdk.Razor . Microsoft.NET.Sdk.BlazorWebAssembly Ajoutez le framework WebAssembly et les packages clients Power Portals Pro :
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<StaticWebAssetProjectMode>Default</StaticWebAssetProjectMode>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" />
<PackageReference Include="PowerPortalsPro.Web.Client" />
<PackageReference Include="PowerPortalsPro.Web.Blazor.FluentUI" />
<PackageReference Include="PowerPortalsPro.Web.Common" />
</ItemGroup>
</Project>
Ajoutez également le paquet d’hébergement serveur WebAssembly à l’hôte .csproj serveur — il fournit le middleware qui sert le bundle WASM :
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" />
2. Enregistrer des composants WebAssembly interactifs sur le serveur
Dans le serveur Program.cs, remplacez l’enregistrement des composants par les appels builder correspondants. AddAuthenticationStateSerialization() sérialise l’utilisateur authentifié à travers la frontière Serveur→WASM afin que la cascade AuthenticationState soit cohérente sur les deux runtimes :
// Remplacer
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
// Avec (Auto)
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents()
.AddInteractiveWebAssemblyComponents()
.AddAuthenticationStateSerialization();
// Ou (WebAssembly)
builder.Services.AddRazorComponents()
.AddInteractiveWebAssemblyComponents()
.AddAuthenticationStateSerialization();
3. Cartographier le mode de rendu WebAssembly
Mise à jour app.MapRazorComponents<App>() pour enchaîner les terminaux de mode de rendu correspondants. L’appel AddAdditionalAssemblies pointe déjà vers les .Client assemblages _Imports dans les modèles, donc cela ne change pas ici :
// Auto
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode()
.AddInteractiveWebAssemblyRenderMode()
.AddAdditionalAssemblies(typeof(MyApp.Client._Imports).Assembly);
// WebAssembly
app.MapRazorComponents<App>()
.AddInteractiveWebAssemblyRenderMode()
.AddAdditionalAssemblies(typeof(MyApp.Client._Imports).Assembly);
4. Mettre à jour le PageRenderMode d’App.razor
Dans App.razorle getter PageRenderMode de , retournez le nouveau mode de rendu. Épinglez /Account/* d’abordInteractiveWebAssemblyRenderMode(prerender: false), puis retournez par défaut pour tout le reste :
// Dans le getter PageRenderMode d’App.razor
if (HttpContext.Request.Path.StartsWithSegments("/Account"))
return new InteractiveWebAssemblyRenderMode(prerender: false);
// Auto
return new InteractiveAutoRenderMode();
// WebAssembly
return new InteractiveWebAssemblyRenderMode();
Le broche Account-route est nécessaire car celui du IAuthService framework n’est enregistré que dans le graphe DI du client WASM. Sans le NIP, le prérendu côté serveur d’Auto ne se résout [Inject] IAuthService pas lors d’une session à froid.
5. Ajouter . Client/Program.cs
Créez un dans Program.cs le .Client projet. Cela configure l’hébergeur WebAssembly, enregistre le HttpClient site auprès du gestionnaire de transfert de cookies (donc des appels authentifiés du client WASM pour /api/* voir le même cookie d’authentification que le navigateur), et appelle AddPowerPortalsProWebClient pour enregistrer les services du cadre côté WASM. L’appel UserPowerPortalsProWebClient pré-récupère les chaînes de localisation de coupe croisée au démarrage afin que la première peinture ne flashe pas le texte clé comme solution de secours :
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Microsoft.FluentUI.AspNetCore.Components;
using PowerPortalsPro.Web.Blazor.FluentUI;
using PowerPortalsPro.Web.Client;
using PowerPortalsPro.Web.Client.Services;
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.Services.AddFluentUIComponents();
builder.Services.AddSingleton<CookieCredentialsHandler>();
builder.Services.AddHttpClient("PowerPortalsPro", client =>
client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
.AddHttpMessageHandler<CookieCredentialsHandler>();
builder.Services.AddSingleton(sp =>
sp.GetRequiredService<IHttpClientFactory>().CreateClient("PowerPortalsPro"));
builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddAuthenticationStateDeserialization();
builder.Services.AddPowerPortalsProWebClient();
var app = builder.Build();
await app.UserPowerPortalsProWebClient(
LocalizationBaselines.Default.Concat(new[] { "app" }).ToArray());
await app.RunAsync();
6. Passer du post-formulaire aux terminaux d’authentification JSON
Les hôtes serveurs utilisent MapAdditionalIdentityEndpoints() les pages d’identité de publication de formulaires. WebAssembly et les hôtes Auto utilisent MapAuthEndpoints<TUser>() à la place — le .Clientwrapper de 's IAuthService appelle ces terminaux JSON sous /api/auth/*:
// Ajoutez à la Program.cs du serveur (après l’application. UsePowerPortalsProWebServer)
app.MapAuthEndpoints<PortalUser>();
// Éventuellement, échangez les terminaux Identity de type formul-post contre ceux JSON
// (supprimez la ligne ci-dessous — elle n’est consommée que par les pages de compte rendues par le serveur)
// application. MapAdditionalIdentityEndpoints() ;
Lorsque l’hôte exécute à la fois des pages de compte serveur et WASM (ce qui est rare), les deux enregistrements de terminaux peuvent coexister. Les modèles par défaut choisissent l’un ou l’autre en fonction du mode d’interactivité.
7. Déplacez les pages de compte vers le fichier . Projet client
Power Portals Pro propose deux ensembles parallèles de pages de compte, une pour chaque contexte de rendu :
- Supprimez les pages rendues par le serveur sous
Components/Account/Pages/et les classes d’aide (IdentityRedirectManager,IdentityUserAccessor,IdentityComponentsEndpointRouteBuilderExtensions,CookieLoginController) du projet serveur. - Ajoutez les pages du compte WASM sous
.Client/Pages/Account/. Le moyen le plus rapide est d’échauffer un projet neuf avec--interactivity Autoet de les copier — ils couvrent Connexion, Registre, OubliéMot de Passe, RéinitialiserPassword, ConfirmEmail, Connexion Externe, et toute la surface Gérer/*. - Si vous personnalisez l’une des pages de compte rendues par le serveur (validation personnalisée, champs supplémentaires), transférez ces personnalisations vers les équivalents WASM — ils implémentent la même expérience utilisateur au lieu
IAuthServicedeUserManager.
8. Optionnel — gestionnaire d’exception à portée pour /api/*
Lorsque WebAssembly est en jeu, des exceptions sont lancées de /api/* la nécessité de faire un aller-retour vers le client WASM sous forme de problème RFC 9457 + json afin que le côté PowerPortalsProService client puisse réhydrater le type CLR original. Les modèles associent cela à un champ de vision UseExceptionHandler /api/* uniquement — la page d’exception développeur gère toujours les erreurs de page rendues par le serveur ailleurs :
if (app.Environment.IsDevelopment())
{
app.UseWebAssemblyDebugging();
app.UseWhen(
ctx => ctx.Request.Path.StartsWithSegments("/api"),
branch => branch.UseExceptionHandler());
}
WebAssembly ou serveur → automatique
Inversez les étapes ci-dessus :
- Supprimer
AddInteractiveWebAssemblyComponents()etAddAuthenticationStateSerialization()à partir de l’enregistrement des composants du serveur ; conserverAddInteractiveServerComponents()seulement. - Remplacez
.AddInteractiveWebAssemblyRenderMode()(et toutInteractiveServerRenderModece qui est enchaîné le côté) par un simple.AddInteractiveServerRenderMode()pouceMapRazorComponents<App>(). - Dans
App.razor,PageRenderModelâche la/Account/*épingle et retournenew InteractiveServerRenderMode()pour chaque itinéraire interactif. - Replacez les pages de compte dans le projet serveur en
Components/Account/Pages/utilisant leUserManagerpatron -direct (ou échaffaitez un nouveau projet serveur et copiez-les). RéajoutezIdentityRedirectManager/IdentityUserAccessorpuis retirez l’ensemble.Client/Pages/Account/. - Remplacez
app.MapAuthEndpoints<PortalUser>()parapp.MapAdditionalIdentityEndpoints(). - Revenez le
.ClientSDK du projet àMicrosoft.NET.Sdk.Razor, supprimez les références du paquet WebAssembly, et supprimez.Client/Program.cset.Client/wwwroot/.
Assemblage Web automatique ↔
Le switch le moins cher — la mise en page du projet, les paquets et les pages de compte sont identiques entre les deux. Seules trois choses changent :
- Dans
App.razor,PageRenderModeéchangeznew InteractiveAutoRenderMode()pournew InteractiveWebAssemblyRenderMode()(ou inversement) sur la branche par défaut. La/Account/*goupille reste la même dans les deux modes. - Sur le serveur
Program.cs, ajouter ou retirerAddInteractiveServerComponents()—AddRazorComponents()Auto en a besoin, pas seulement WebAssembly. - Dans le serveur
Program.cs, ajoutez ou retirez.AddInteractiveServerRenderMode()dansMapRazorComponents<App>().
Vérification du changement
Après avoir effectué les modifications :
- Construis la solution. La plupart des erreurs de câblage apparaissent au moment de la compilation — méthodes manquantes en mode de rendu, types non résolus, ou références obsolètes à la page de compte.
- Connectez-vous, entrez et sortez. L’authentification est la chose la plus perturbatrice à changer — exercez le cycle complet de connexion → gestion du profil → de déconnexion pour confirmer que les nouveaux points de terminaison sont correctement câblés.
- Cliquez sur une page interactive. Un clic sur une grille ou un éditeur prouve que l’interactivité atteint le bon runtime. Le mode serveur affiche une connexion SignalR dans l’onglet WebSocket des outils de développement ; WebAssembly affiche les fichiers d’exécution sous
/_framework/l’onglet réseau. - Vérifie le pack WASM lors du premier chargement. Pour les modes WebAssembly et Auto, l’onglet réseau lors d’un chargement neuf (cache incognito ou effacé) devrait afficher les assemblages runtime + framework + portail en streaming.
- Vérifiez les pages Compte/Gestion. Modifications de profil, de mots de passe et connexion externe reliant chaque point de terminaison — vérifiez qu’ils sont tous terminés proprement.
Note
Faites attention aux incompatibilités service-durée de vie lors du transfert de services entre le serveur et le client WASM. L’hôte WASM fonctionne en un seul scope par session, mais les services de mise en cache du framework sont enregistrés comme singletons — si vous enregistrez votre propre service du
Transientcôté WASM, chaque état d’instance réinitialise silencieusement chaque résolution. Utilisez-leSingletondu côté WASM pour tout service qui détient un état mutable.
