Standortverwaltung
PowerPortalsPro liefert eine Site-Admin-Seite, die es einem von SystemUser-Nutzern unterstützten Administrator ermöglicht, serverseitige Caches zu löschen, ohne den Host neu starten zu müssen. Das Framework stellt die Cache-Clear-API bereit (IPowerPortalsProService.ClearAllCachesAsync / ClearCacheAsync); dein Portal stellt die Seite selbst, das Rollengatter und den Navigationslink bereit.
Verkabeln
Drei Dinge, die man anschließen sollte: den Rollenbeanspruchungstransformator, die Seite selbst und einen Navigationseintrag. Die Portal-Vorlagen (powerportalspro-csharp mit den Auto, WebAssembly, oder Server Interaktivitätsoptionen) liefern alle drei direkt aus der Box – die darunterliegenden Ausschnitte spiegeln das wider, was die Vorlagen aussenden, sodass du sie in ein Portal heben kannst, das nicht aus einer Vorlage generiert wurde.
1. Konfigurieren Sie, welche Dataverse-Rollen Verwaltung gewähren
SystemAdminClaimsTransformer stempelt einen synthetischen SystemAdmin Rollenanspruch auf jeden internen Nutzer, der entweder die integrierte System Administrator Dataverse-Sicherheitsrolle oder eine benutzerdefinierte namens in SecurityOptions.SystemAdminRoleName hält – dieselbe Regel, aus derselben Einstellung gelesen, die die Admin-Endpunkte des Frameworks prüfen. Die eingebaute Rolle wird immer als Admin behandelt; die konfigurierte Rolle ist optional und legt darüber Schichten. Gatet die Benutzeroberfläche mit [AuthorizeSystemAdmin] und <SystemAdminView> (in React, useIsSystemAdmin() oder <SystemAdminView>), die genau die Frage stellen, die die Endpunkte stellen, sodass einer benutzerdefinierten Dataverse-Rolle Admin-Zugriff gewährt werden kann, ohne den Rasiercode zu berühren. Gatet stattdessen nicht auf den Namen: [Authorize(Roles = "SystemAdmin")] und <AuthorizeView Roles="SystemAdmin"> passt die untypisierte Rollenbehauptung ab, die auch eine Portal- oder Webrolle, die jemand benannt SystemAdmin hat, enthält.
// appsettings.json – optional. Inhaber des integrierten "Systemadministrators"
// Die Dataverse-Rollen werden immer wie Portaladministratoren behandelt; SystemAdminRoleName-Schichten
// eine zusätzliche Dataverse-Rolle obendrauf.
{
"Security": {
"SystemAdminRoleName": "Portaladministrator"
}
}
// Program.cs
builder.Services.Configure<SecurityOptions>(
builder.Configuration.GetSection("Security"));
builder.Services.AddSingleton<IClaimsTransformation, SystemAdminClaimsTransformer>();
2. Hinzufügen der Seite zur Website-Verwaltung
Das Attribut [AuthorizeSystemAdmin] wird von AuthorizeRouteViewrespektiert; das innere <SystemAdminView> ist Defense-in-depth, falls ein Host den Router tauscht. Beide lassen nur eine interne (systemuser)-Sitzung zu, die eine der oben genannten Rollen innehat. Die ganze Seite (mit dem Clear All-Button, der Pro-Cache-Liste mit lokalisierten Beschreibungen und dem Toast-Feedback) befindet sich in den Vorlagen. SiteAdmin.razor
@attribute [Route("admin/site-admin")]
@attribute [AuthorizeSystemAdmin]
@inject IPowerPortalsProService _powerPortalsProService
@inject IToastService _toastService
<SystemAdminView>
<Authorized>
</Authorized>
</SystemAdminView>
3. Tauche es im Navigationssystem an
Packe die Admin-Navigationsgruppe in eine <SystemAdminView> Rolle, damit Nicht-Admins keinen Link sehen, dem sie nicht folgen können. Das Linkziel ist die Route, auf der sich die Seite registriert.
<SystemAdminView>
<Authorized>
<FluentNavCategory Title="Verwaltung" IconRest="@(new Size20.WrenchSettings())">
<FluentNavItem Href="admin/site-admin">
<FluentIcon Value="@(new Size20.LauncherSettings())" />
Standortverwaltung
</FluentNavItem>
</FluentNavCategory>
</Authorized>
</SystemAdminView>
Was wird zwischengespeichert
Das Framework registriert neun Caches als IClearableCache; die Site Admin-Seite stellt sie alphabetisch sortiert mit ihren lokalisierten Beschreibungen neben jedem dar. Die Beschreibungen liefern sich im Rahmen ppp-server.defaults.en.json app.cache-descriptionsunter .
- TableMetadata — Metadaten pro Tabelle (Spalten, Typen, Auswahloptionen, Beziehungen). Aktualisieren Sie nach Schemaänderungen.
- ViewMetadata — Zwischengespeicherte Dataverse-Ansichten (FetchXML, Spalten, Sortieren). Aktualisieren Sie nach der Bearbeitung einer Ansicht in Dataverse.
- EntityMetadata — Rohe Dataverse-Entitätsmetadaten, die von Framework-Code auf niedrigerer Ebene verwendet werden. Gleiche Quelle wie TableMetadata in einer anderen Form – typischerweise zusammen zurückgesetzt.
- StringLocalizer — Alle lokalisierten Strings – Dataverse-Tabellen-/Spaltenlabels, Webressourcen und Ordner-JSON-Dateien. Aktualisieren Sie nach der Bearbeitung einer beliebigen Lokalisierungsquelle.
- UserPrivileges — Per Benutzer wurde Sicherheitsrechte gelöst (welche Rollen welche Berechtigungen gewähren). Aktualisieren Sie nach Änderung der Rollenzuweisungen eines Benutzers.
- TablePermissions — Die CRUD-Berechtigungen pro Benutzer wurden über die Tabellen-Recht-Handler-Kette gelöst. Meistens abgeleitet von UserPrivileges for SystemUsers.
- PrivilegeMetadata — Organisationsweite Berechtigungsdefinitionen aus der Dataverse-Privilegientabelle. Fast nie ändert sich – nur Updates der Dataverse-Plattform führen neue Beiträge ein.
- OrganizationFileSettings — Datei-Upload-Einstellungen auf Org-Ebene (maximale Größe, erlaubte Erweiterungen). Aktualisieren Sie diese nach Änderungen in Dataverse.
- Currency — Organisationsweite Transaktionswährungs-Snapshot plus die Basiswährung der Organisation. Aktualisieren Sie, nachdem Administratoren Währungen in Dataverse hinzugefügt oder aktualisiert haben.
- EmailSender — Absendereintrag für ausgehende E-Mails gelöst (Abfrage der konfigurierten Absenderadresse auf deren Dataverse-Entitätsreferenz).
Der StringLocalizer-Rebuild ist der langsame
Das Löschen des StringLocalizer-Caches durchläuft die Metadaten der lokalisierten Dataverse-Tabellen + jede Webressource + jede Ordnerdatei und baut das In-Memory-Wörterbuch wieder auf. Rechnen Sie mit 20–30 Sekunden in einer realen Umgebung. Der atomare Rebuild garantiert, dass die Leser die vorherigen Werte während des gesamten Rebuilds weiterhin sehen – es gibt keine Phase, in der der Cache leer ist.
Hinzufügen deines eigenen Caches
Implementiere IClearableCache und registriere es sowohl als deine Betonleistung ALS auch als IClearableCache. Die Site-Admin-Seite nimmt es automatisch auf und stellt es alphabetisch zusammen mit dem Rest dar. Die Eigenschaft Name ist die öffentliche Identifikatorin – das ist das, was auf dem Button pro Cache angezeigt wird.
public class MyCustomCache : IClearableCache
{
public string Name => "MyCustomCache";
public Task ClearAsync(CancellationToken cancellationToken)
{
// Lass deinen In-Memory-Zustand fallen, befülle neu usw.
return Task.CompletedTask;
}
}
// Program.cs
builder.Services.AddSingleton<MyCustomCache>();
builder.Services.AddSingleton<IClearableCache>(sp => sp.GetRequiredService<MyCustomCache>());
Lokalisierte Beschreibung
Die Site Admin-Seite schaut im Localizer nach oben app.cache-descriptions.<Name> , um den Beschreibungstext neben dem Button darzustellen. Füge einen Eintrag unter diesem Namensraum in den Dateien deines Portals app.en.json (und aller anderen Sprachen) hinzu; Seiten ohne registrierte Beschreibung geben elegant nur den Button dar.
{
"app": {
"cache-descriptions": {
"MyCustomCache": "Was dieser Cache enthält und wann er zurückgesetzt werden sollte."
}
}
}
Alle löschen vs. pro Cache
Clear All führt alle registrierten Caches ClearAsync parallel aus und meldet die Ergebnisse pro Cache (erfolgreich / fehlgeschlagen / abgelaufene MS) in der Antwort. Die Pro-Cache-Buttons lösen sich ClearAsync für einen Cache gleich aus – nützlich, wenn man nur einen Cache ablegen muss (zum Beispiel nach der Bearbeitung einer einzelnen Dataverse-Ansicht).
API-Referenz
Die Cache-Clear-API lebt auf IPowerPortalsProService; die zugrundeliegende Orchestrierung, die jeden Cache parallel ausführt, ClearAsync lebt auf ICacheManager. Die Schnittstellen werden unten zusammengefasst.
IClearableCache Interface
Eigenschaften
Name | Typ | Default | Beschreibung |
|---|---|---|---|
Name | string | Ein kurzer, stabiler Name für Telemetrie- / UI-Feedback (z. B. |
NameMethoden
Name | Parameter | Typ | Beschreibung |
|---|---|---|---|
ClearAsync | CancellationToken cancellationToken | Task | Leert den Inhalt des Caches. Für Caches, die vorgeladene Daten speichern (z. B. |
ClearAsyncICacheManager Interface
Methoden
Name | Parameter | Typ | Beschreibung |
|---|---|---|---|
ClearAllAsync | CancellationToken cancellationToken | Task<IReadOnlyList<CacheClearResult>> | Löscht alle parallel registrierten Registrierten Services.IClearableCache und liefert zurück Ein Bericht pro Cache. Ein fehlgeschlagener Cache blockiert nicht die anderen – seinen Eintrag in Der Bericht enthält die Ausnahmemeldung |
ClearAsync | string name CancellationToken cancellationToken | Task<CacheClearResult> | Löscht einen benannten Cache. Rückkehrt null , wenn nicht registriert ist Cache-Übereinstimmungen name (groß- und kleinschreibungsunempfindlich). Fehlschläge werden verpackt im Ergebnis statt geworfen zu werden, entspricht Threading.CancellationToken). |
GetCacheNames | IReadOnlyList<string> | Gibt die Namen aller registrierten Services.IClearableCache, passenden Personen, zurück für eine Admin-Benutzeroberfläche, die pro Cache Lösch-Buttons rendern will. |
ClearAllAsyncServices.IClearableCache und liefert zurück Ein Bericht pro Cache. Ein fehlgeschlagener Cache blockiert nicht die anderen – seinen Eintrag in Der Bericht enthält die Ausnahmemeldung ClearAsyncCancellationToken cancellationToken
null , wenn nicht registriert ist Cache-Übereinstimmungen name (groß- und kleinschreibungsunempfindlich). Fehlschläge werden verpackt im Ergebnis statt geworfen zu werden, entspricht Threading.CancellationToken).GetCacheNamesServices.IClearableCache, passenden Personen, zurück für eine Admin-Benutzeroberfläche, die pro Cache Lösch-Buttons rendern will.