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 Hauptverantwortlichen, der entweder die integrierte System Administrator Dataverse-Rolle oder eine benutzerdefinierte Rolle über PortalIdentityOptions.SystemAdminRoleNamehält. Die eingebaute Rolle wird immer als Verwaltung behandelt; Die konfigurierte Rolle ist optional und legt Schichten darüber. UI-Autorisierung ([Authorize(Roles = "SystemAdmin")] und <AuthorizeView Roles="SystemAdmin">) prüft den synthetischen Anspruch, sodass einer benutzerdefinierten Dataverse-Rolle Administratorzugriff gewährt werden kann, ohne den Razor Code zu berühren.
// appsettings.json – optional. Inhaber des integrierten "Systemadministrators"
// Die Dataverse-Rollen werden immer wie Portaladministratoren behandelt; SystemAdminRoleName-Schichten
// eine zusätzliche Dataverse-Rolle obendrauf.
{
"PortalIdentity": {
"SystemAdminRoleName": "Portaladministrator"
}
}
// Program.cs
builder.Services.Configure<PortalIdentityOptions>(
builder.Configuration.GetSection("PortalIdentity"));
builder.Services.AddSingleton<IClaimsTransformation, SystemAdminClaimsTransformer>();
2. Hinzufügen der Seite zur Website-Verwaltung
Das Attribut [Authorize(Roles = "SystemAdmin")] wird durch AuthorizeRouteViewgeachtet; das innere <AuthorizeView Roles="SystemAdmin"> ist Defense-in-Depth, falls ein Host den Router tauscht. Die ganze Seite (mit dem Löschen-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 [Authorize(Roles = "SystemAdmin")]
@inject IPowerPortalsProService _powerPortalsProService
@inject IToastService _toastService
<AuthorizeView Roles="SystemAdmin">
<Authorized>
</Authorized>
</AuthorizeView>
3. Tauche es im Navigationssystem an
Packe die Admin-Navigationsgruppe in und verpacke <AuthorizeView Roles="SystemAdmin"> , damit Nicht-Administratoren keinen Link sehen, dem sie nicht folgen können. Das Link-Ziel ist die Route, auf der sich die Seite registriert.
<AuthorizeView Roles="SystemAdmin">
<Authorized>
<FluentNavGroup Title="Verwaltung" Icon="@(new Size20.WrenchSettings())">
<FluentNavLink Href="admin/site-admin"
Icon="@(new Size20.LauncherSettings())">
Standortverwaltung
</FluentNavLink>
</FluentNavGroup>
</Authorized>
</AuthorizeView>
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 jeder Dataverse-Tabelle + jede Webressource + jede Ordnerdatei und baut das In-Memory-Wörterbuch neu auf. Rechnen Sie mit 20–30 Sekunden gegen eine reale Umgebung. Der atomare Neuaufbau 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.