Administrateur du site
PowerPortalsPro propose une page d’administrateur de site qui permet à un administrateur soutenu par SystemUser de vider les caches côté serveur sans redémarrer l’hôte. Le framework fournit l’API de nettoyage du cache (IPowerPortalsProService.ClearAllCachesAsync / ClearCacheAsync) ; votre portail fournit la page elle-même, la porte de rôle et le lien de navigation.
Le câblage
Trois éléments à intégrer : le transformateur de revendication de rôle, la page elle-même, et une entrée de navigation. Les modèles de portails (powerportalspro-csharp avec les Auto, WebAssembly, ou Server les options d’interactivité) livrent les trois dès la sortie de la boîte — les extraits ci-dessous reflètent ce que les modèles émettent afin que vous puissiez les soulever dans un portail qui n’a pas été généré à partir d’un modèle.
1. Configurer quels rôles Dataverse accordent à l’administrateur
SystemAdminClaimsTransformer marque une revendication de rôle synthétique SystemAdmin sur tout principal détenant soit le rôle Dataverse intégré System Administrator , soit un rôle personnalisé configuré via PortalIdentityOptions.SystemAdminRoleName. Le rôle intégré est toujours considéré comme administrateur ; Le rôle configuré est optionnel et superposé par-dessus. L’autorisation UI ([Authorize(Roles = "SystemAdmin")] et <AuthorizeView Roles="SystemAdmin">) vérifie la revendication synthétique, de sorte qu’un rôle personnalisé Dataverse puisse obtenir un accès administrateur sans toucher au code rasoir.
// appsettings.json — optionnel. Détenteurs du « System Administrator » intégré
// Les rôles Dataverse sont toujours considérés comme des administrateurs de portails ; Couches SystemAdminRoleName
// un rôle supplémentaire dans le Dataverse en tête.
{
"PortalIdentity": {
"SystemAdminRoleName": "Administrateur de portail"
}
}
// Program.cs
builder.Services.Configure<PortalIdentityOptions>(
builder.Configuration.GetSection("PortalIdentity"));
builder.Services.AddSingleton<IClaimsTransformation, SystemAdminClaimsTransformer>();
2. Ajouter la page d’administrateur du site
L’attribut [Authorize(Roles = "SystemAdmin")] est honoré par AuthorizeRouteView; l’intérieur <AuthorizeView Roles="SystemAdmin"> est défense en profondeur au cas où un hôte échangerait le routeur. La page complète (avec le bouton Effacer tout, la liste par cache avec des descriptions localisées, et les retours toast) se trouve dans les modèles SiteAdmin.razor.
@attribute [Route("admin/site-admin")]
@attribute [Authorize(Roles = "SystemAdmin")]
@inject IPowerPortalsProService _powerPortalsProService
@inject IToastService _toastService
<AuthorizeView Roles="SystemAdmin">
<Authorized>
</Authorized>
</AuthorizeView>
3. Faire surface dans la navigation
Encapsulez le groupe de navigation Admin dans un <AuthorizeView Roles="SystemAdmin"> système pour que les non-administrateurs ne voient pas un lien qu’ils ne peuvent pas suivre. La cible du lien est la route où la page s’enregistre.
<AuthorizeView Roles="SystemAdmin">
<Authorized>
<FluentNavGroup Title="Administration" Icon="@(new Size20.WrenchSettings())">
<FluentNavLink Href="admin/site-admin"
Icon="@(new Size20.LauncherSettings())">
Administrateur du site
</FluentNavLink>
</FluentNavGroup>
</Authorized>
</AuthorizeView>
Ce qui est mis en cache
Le framework enregistre neuf caches comme IClearableCache; la page Administrateur du site les rend triés alphabétiquement avec leurs descriptions localisées à côté de chacune. Les descriptions se trouvent dans les cadres ppp-server.defaults.en.json sous app.cache-descriptions.
- TableMetadata — Métadonnées par table (colonnes, types, options de choix, relations). Rafraîchissement après changements de schéma.
- ViewMetadata — Vues Dataverse mises en cache (FetchXML, colonnes, tri). Rafraîchir après avoir modifié une vue dans Dataverse.
- EntityMetadata — Métadonnées brutes de l’entité Dataverse utilisées par le code framework de bas niveau. Même source que TableMetadata mais sous une forme différente — généralement réinitialisée ensemble.
- StringLocalizer — Toutes les chaînes localisées — étiquettes de tables/colonnes Dataverse, ressources web et fichiers JSON de dossiers. Rafraîchir après avoir modifié n’importe quelle source de localisation.
- UserPrivileges — Privilèges de sécurité résolus par utilisateur (quels rôles accordent quelles permissions). Rafraîchir après avoir modifié l’attribution des rôles d’un utilisateur.
- TablePermissions — Les permissions CRUD par utilisateur, par table étaient résolues via la chaîne de gestion des permissions de table. Principalement dérivé de UserPrivileges for SystemUsers.
- PrivilegeMetadata — Définitions des privilèges à l’échelle de l’organisation issues de la table des privilèges Dataverse. Presque jamais cela ne change — seules les mises à jour de la plateforme Dataverse introduisent de nouvelles entrées.
- OrganizationFileSettings — Paramètres d’envoi de fichiers au niveau de l’organisation (taille maximale, extensions autorisées). Rafraîchir après avoir changé ces éléments dans Dataverse.
- Currency — Instantané de transactionmonnaie à l’échelle de l’organisation plus la devise de base de l’organisation. Rafraîchir après que les administrateurs ont ajouté ou mis à jour des devises dans Dataverse.
- EmailSender — Enregistrement de l’expéditeur résolu pour les emails sortants (recherche de l’adresse de l’expéditeur configurée dans sa référence d’entité Dataverse).
La reconstruction de StringLocalizer est la plus lente
Vider le cache StringLocalizer parcourt les métadonnées de chaque table Dataverse + chaque ressource web + chaque fichier de dossier et reconstruit le dictionnaire en mémoire. Attendez-vous à 20 à 30 secondes dans un environnement réel. La reconstruction atomique garantit que les lecteurs continuent de voir les valeurs précédentes tout au long de la reconstruction — il n’y a pas de période où le cache est vide.
Ajouter votre propre cache
Implémentez-le IClearableCache et enregistrez-le à la fois comme votre service de béton ET IClearableCachecomme . La page d’administrateur du site la récupère automatiquement et la rend par ordre alphabétique avec le reste. La Name propriété est l’identifiant public — c’est ce qui apparaît sur le bouton par cache.
public class MyCustomCache : IClearableCache
{
public string Name => "MyCustomCache";
public Task ClearAsync(CancellationToken cancellationToken)
{
// Abandonnez votre état en mémoire, repeuplez, etc.
return Task.CompletedTask;
}
}
// Program.cs
builder.Services.AddSingleton<MyCustomCache>();
builder.Services.AddSingleton<IClearableCache>(sp => sp.GetRequiredService<MyCustomCache>());
Description localisée
La page Administrateur du site retrouve app.cache-descriptions.<Name> dans le localisateur pour afficher le texte de description à côté du bouton. Ajoutez une entrée sous cet espace de noms dans les fichiers de app.en.json votre portail (et dans tout autre langage) ; les pages sans description enregistrée affichent gracieusement uniquement le bouton.
{
"app": {
"cache-descriptions": {
"MyCustomCache": "Ce que contient ce cache et quand il doit être réinitialisé."
}
}
}
Effacer tout contre par cache
Effacer Tout exécute tous les caches ClearAsync enregistrés en parallèle et rapporte les résultats par cache (réussi / échec / ms écoulés) dans la réponse. Les boutons par cache se déclenchent de la même ClearAsync façon pour un seul cache — utile quand vous n’avez besoin d’en supprimer qu’un seul (par exemple, après avoir modifié une seule vue Dataverse).
Référence API
L’API de nettoyage du cache vit sur IPowerPortalsProService; l’orchestration sous-jacente qui exécute ClearAsync chaque cache en parallèle se trouve sur ICacheManager. Les interfaces sont résumées ci-dessous.
IClearableCache Interface
Propriétés
Nom | Type | Par défaut | Description |
|---|---|---|---|
Name | string | Un nom court et stable pour la télémétrie / retour d’interface utilisateur (par exemple |
NameMéthodes
Nom | Paramètres | Type | Description |
|---|---|---|---|
ClearAsync | CancellationToken cancellationToken | Task | Efface le contenu de la cache. Pour les caches qui maintiennent des données préchargées (par exemple |
ClearAsyncICacheManager Interface
Méthodes
Nom | Paramètres | Type | Description |
|---|---|---|---|
ClearAllAsync | CancellationToken cancellationToken | Task<IReadOnlyList<CacheClearResult>> | Efface tout enregistré Services.IClearableCache en parallèle et revient Un rapport par cache. Un cache défaillant ne bloque pas les autres — son entrée dans le rapport porte le message d’exception au lieu de |
ClearAsync | string name CancellationToken cancellationToken | Task<CacheClearResult> | Ça vide un cache nommé. Déclarations null en cas d’absence d’enregistrement correspondance name de cache (insensible à la majuscule). Les défaillances sont enveloppées dans le résultat plutôt que lancé, correspondant Threading.CancellationToken)à . |
GetCacheNames | IReadOnlyList<string> | Retourne les noms de chaque enregistrement Services.IClearableCache, approprié pour une interface d’administration qui souhaite afficher les boutons de nettoyage par cache. |
ClearAllAsyncServices.IClearableCache en parallèle et revient Un rapport par cache. Un cache défaillant ne bloque pas les autres — son entrée dans le rapport porte le message d’exception au lieu de ClearAsyncCancellationToken cancellationToken
null en cas d’absence d’enregistrement correspondance name de cache (insensible à la majuscule). Les défaillances sont enveloppées dans le résultat plutôt que lancé, correspondant Threading.CancellationToken)à .GetCacheNamesServices.IClearableCache, approprié pour une interface d’administration qui souhaite afficher les boutons de nettoyage par cache.