Administrador del sitio
PowerPortalsPro incluye una página de administrador del sitio que permite a un administrador respaldado por SystemUser limpiar cachés del lado del servidor sin reiniciar el host. El framework proporciona la API de limpieza de caché (IPowerPortalsProService.ClearAllCachesAsync / ClearCacheAsync); tu portal proporciona la página en sí, la puerta de roles y el enlace de navegación.
Conectándolo
Tres cosas que conectar: el transformador de reclamación de rol, la propia página y una entrada de navegación. Las plantillas de portal (powerportalspro-csharp con las Autoopciones , WebAssembly, o Server interactividad) incluyen las tres desde el primer momento: los fragmentos de abajo reflejan lo que emiten las plantillas para que puedas llevarlas a un portal que no se generó a partir de una plantilla.
1. Configurar qué roles de Dataverse otorgan administrador
SystemAdminClaimsTransformer marca una reivindicación de rol sintético SystemAdmin sobre cualquier principal que System Administrator posea el rol Dataverse incorporado o un rol personalizado configurado mediante PortalIdentityOptions.SystemAdminRoleName. El rol incorporado siempre se trata como administrador; El rol configurado es opcional y se superpone por encima. La autorización de la interfaz ([Authorize(Roles = "SystemAdmin")] y <AuthorizeView Roles="SystemAdmin">) comprueba la reivindicación sintética, por lo que un rol personalizado de Dataverse puede recibir acceso de administrador sin tocar el código de afeița.
// appsettings.json — opcional. Poseedores del "System Administrator" incorporado
// Los roles de Dataverse siempre se tratan como administradores de portales; Capas SystemAdminRoleName
// un rol adicional en Dataverse encima.
{
"PortalIdentity": {
"SystemAdminRoleName": "Administrador de Portal"
}
}
// Program.cs
builder.Services.Configure<PortalIdentityOptions>(
builder.Configuration.GetSection("PortalIdentity"));
builder.Services.AddSingleton<IClaimsTransformation, SystemAdminClaimsTransformer>();
2. Añadir la página de Administrador del Sitio
El [Authorize(Roles = "SystemAdmin")] atributo se respeta con AuthorizeRouteView; el interior <AuthorizeView Roles="SystemAdmin"> es defensa en profundidad en caso de que un host cambie el router. La página completa (con el botón Borrar Todo, la lista por caché con descripciones localizadas y el feedback de tostada) está en las plantillas SiteAdmin.razor.
@attribute [Route("admin/site-admin")]
@attribute [Authorize(Roles = "SystemAdmin")]
@inject IPowerPortalsProService _powerPortalsProService
@inject IToastService _toastService
<AuthorizeView Roles="SystemAdmin">
<Authorized>
</Authorized>
</AuthorizeView>
3. Aflorar en la navegación
Envuelve el grupo de navegación de administradores para <AuthorizeView Roles="SystemAdmin"> que los no administradores no vean ningún enlace que no puedan seguir. El destino del enlace es la ruta en la que se registra la página.
<AuthorizeView Roles="SystemAdmin">
<Authorized>
<FluentNavGroup Title="Administración" Icon="@(new Size20.WrenchSettings())">
<FluentNavLink Href="admin/site-admin"
Icon="@(new Size20.LauncherSettings())">
Administrador del sitio
</FluentNavLink>
</FluentNavGroup>
</Authorized>
</AuthorizeView>
Qué se almacena en caché
El framework registra nueve cachés como IClearableCache; la página de Administrador del Sitio las muestra ordenadas alfabéticamente con sus descripciones localizadas junto a cada una. Las descripciones se encuentran en los marcos ppp-server.defaults.en.json bajo app.cache-descriptions.
- TableMetadata — Metadatos por tabla (columnas, tipos, opciones de elección, relaciones). Actualizar después de los cambios en el esquema.
- ViewMetadata — Vistas en caché de Dataverse (FetchXML, columnas, ordenación). Actualiza después de editar una vista en Dataverse.
- EntityMetadata — Metadatos brutos de la entidad Dataverse usados por el código framework de nivel inferior. La misma fuente que TableMetadata en una forma diferente — normalmente se reinicia juntos.
- StringLocalizer — Todas las cadenas localizadas — etiquetas de tablas/columnas de Dataverse, recursos web y archivos JSON de carpetas. Actualiza después de editar cualquier fuente de localización.
- UserPrivileges — Privilegios de seguridad resueltos por usuario (qué roles otorgan qué permisos). Actualiza después de cambiar la asignación de roles de un usuario.
- TablePermissions — Los permisos CRUD por usuario y por tabla se resolvían a través de la cadena de gestores de permisos de tabla. Principalmente derivado de UserPrivileges for SystemUsers.
- PrivilegeMetadata — Definiciones de privilegios a nivel de organización a partir de la tabla de privilegios de Dataverse. Casi nunca cambia — solo las actualizaciones de la plataforma Dataverse introducen nuevas entradas.
- OrganizationFileSettings — Configuración de subida de archivos a nivel de organización (tamaño máximo, extensiones permitidas). Actualiza después de cambiar estos en Dataverse.
- Currency — Instantánea de transaccionamiento de la moneda a nivel de toda la organización más la moneda base de la organización. Actualiza después de que los administradores añadan o actualicen monedas en Dataverse.
- EmailSender — Registro del remitente resuelto para correos salientes (búsqueda de la dirección del remitente configurada en la referencia de la entidad Dataverse).
La reconstrucción de StringLocalizer es la lenta
Al limpiar la caché de StringLocalizer, se recorren los metadatos de cada tabla de Dataverse + cada recurso web + cada archivo de carpetas y se reconstruye el diccionario en memoria. Espera entre 20 y 30 segundos contra un entorno real. La reconstrucción atómica garantiza que los lectores sigan viendo los valores anteriores durante toda la reconstrucción — no hay ningún periodo en el que la caché esté vacía.
Añadir tu propia caché
Implementa IClearableCache y regístralo tanto como tu servicio de hormigón COMO IClearableCachecomo . La página de Administrador del Sitio lo recoge automáticamente y lo renderiza alfabéticamente junto con el resto. La Name propiedad es el identificador público — es lo que aparece en el botón por caché.
public class MyCustomCache : IClearableCache
{
public string Name => "MyCustomCache";
public Task ClearAsync(CancellationToken cancellationToken)
{
// Elimina tu estado en memoria, replea, etc.
return Task.CompletedTask;
}
}
// Program.cs
builder.Services.AddSingleton<MyCustomCache>();
builder.Services.AddSingleton<IClearableCache>(sp => sp.GetRequiredService<MyCustomCache>());
Descripción localizada
La página de Administrador del Sitio busca app.cache-descriptions.<Name> en el localizador el texto de la descripción junto al botón. Añade una entrada bajo ese espacio de nombres en el archivo de app.en.json tu portal (y en cualquier otro archivo); las páginas sin una descripción registrada se renderizan correctamente solo el botón.
{
"app": {
"cache-descriptions": {
"MyCustomCache": "Qué contiene esta caché y cuándo debe reiniciarse."
}
}
}
Borrar todo vs. por caché
Borrar Todo ejecuta todas las cachés ClearAsync registradas en paralelo y reporta resultados por caché (éxito / fallido / ms transcurridos) en la respuesta. Los botones por caché disparan igual ClearAsync solo para una caché — útil cuando solo necesitas soltar una (por ejemplo, después de editar una sola vista del Dataverse).
Referencia de API
La API de borrado de caché vive en IPowerPortalsProService; la orquestación subyacente que ejecuta ClearAsync cada caché en paralelo permanece en ICacheManager. Las interfaces se resumen a continuación.
IClearableCache Interface
Propiedades
Nombre | Tipo | Default | Descripción |
|---|---|---|---|
Name | string | Un nombre corto y estable para la telemetría / retroalimentación de la interfaz (por ejemplo, |
NameMétodos
Nombre | Parámetros | Tipo | Descripción |
|---|---|---|---|
ClearAsync | CancellationToken cancellationToken | Task | Borra el contenido de la caché. Para cachés que mantienen datos precargados (por ejemplo, |
ClearAsyncICacheManager Interface
Métodos
Nombre | Parámetros | Tipo | Descripción |
|---|---|---|---|
ClearAllAsync | CancellationToken cancellationToken | Task<IReadOnlyList<CacheClearResult>> | Limpia todos los registros Services.IClearableCache en paralelo y regresa Un informe por caché. Una caché fallida no bloquea las demás — su entrada en el informe lleva el mensaje de excepción en lugar de |
ClearAsync | string name CancellationToken cancellationToken | Task<CacheClearResult> | Limpia una caché con nombre. Devoluciones null cuando no están registradas coincidencias name de caché (insensibles a mayúsculas y mayúsculas). Los fallos se envuelven en el resultado, en lugar de lanzado, coincidiendo Threading.CancellationToken)con . |
GetCacheNames | IReadOnlyList<string> | Devuelve los nombres de cada registrado Services.IClearableCache, adecuado para una interfaz de administrador que quiere renderizar botones de limpieza por caché. |
ClearAllAsyncServices.IClearableCache en paralelo y regresa Un informe por caché. Una caché fallida no bloquea las demás — su entrada en el informe lleva el mensaje de excepción en lugar de ClearAsyncCancellationToken cancellationToken
null cuando no están registradas coincidencias name de caché (insensibles a mayúsculas y mayúsculas). Los fallos se envuelven en el resultado, en lugar de lanzado, coincidiendo Threading.CancellationToken)con .GetCacheNamesServices.IClearableCache, adecuado para una interfaz de administrador que quiere renderizar botones de limpieza por caché.