Administrador do Site
O PowerPortalsPro vem uma página de Administrador de Site que permite que um administrador apoiado pelo SystemUser limpe caches do lado do servidor sem reiniciar o host. O framework fornece a API de limpeza de cache (IPowerPortalsProService.ClearAllCachesAsync / ClearCacheAsync); seu portal fornece a própria página, o portal de papel e o link de navegação.
Ligando a fiação
Três coisas para fiar: o transformador de reivindicação de papel, a própria página e uma entrada de navegação. Os templates de portal (powerportalspro-csharp com as Autoopções , WebAssembly, ou Server de interatividade) trazem os três itens de catálogo — os trechos abaixo espelham o que os templates emitem, então você pode levantá-los em um portal que não foi gerado a partir de um template.
1. Configurar quais funções do Dataverse concedem administrador
SystemAdminClaimsTransformer carimba uma reivindicação de papel sintético SystemAdmin em qualquer principal que System Administrator detenha o papel Dataverse embutido ou um papel personalizado configurado via PortalIdentityOptions.SystemAdminRoleName. O papel embutido é sempre tratado como administrador; O papel configurado é opcional e se sobrepõe. A autorização de UI ([Authorize(Roles = "SystemAdmin")] e <AuthorizeView Roles="SystemAdmin">) verifica a reivindicação sintética, então uma função personalizada do Dataverse pode receber acesso de administrador sem precisar tocar em código naval.
// appsettings.json — opcional. Detentores do termo embutido "Administrador de Sistema"
// Os papéis do Dataverse são sempre tratados como administradores de portais; Camadas SystemAdminRoleName
// um papel adicional no Dataverse por cima.
{
"PortalIdentity": {
"SystemAdminRoleName": "Administrador do Portal"
}
}
// Program.cs
builder.Services.Configure<PortalIdentityOptions>(
builder.Configuration.GetSection("PortalIdentity"));
builder.Services.AddSingleton<IClaimsTransformation, SystemAdminClaimsTransformer>();
2. Adicionar a página de Administrador do Site
O [Authorize(Roles = "SystemAdmin")] atributo é respeitado por AuthorizeRouteView; o interno <AuthorizeView Roles="SystemAdmin"> é defesa em profundidade caso um host troque o roteador. A página inteira (com o botão Limpar Tudo, a lista por cache com descrições localizadas e o feedback do toast) está nos templates SiteAdmin.razor.
@attribute [Route("admin/site-admin")]
@attribute [Authorize(Roles = "SystemAdmin")]
@inject IPowerPortalsProService _powerPortalsProService
@inject IToastService _toastService
<AuthorizeView Roles="SystemAdmin">
<Authorized>
</Authorized>
</AuthorizeView>
3. Aflore na nave
Envolva o grupo de navegação de administradores para <AuthorizeView Roles="SystemAdmin"> que não administradores não vejam um link que não possam seguir. O link target é a rota em que a página se registra.
<AuthorizeView Roles="SystemAdmin">
<Authorized>
<FluentNavGroup Title="Administração" Icon="@(new Size20.WrenchSettings())">
<FluentNavLink Href="admin/site-admin"
Icon="@(new Size20.LauncherSettings())">
Administrador do Site
</FluentNavLink>
</FluentNavGroup>
</Authorized>
</AuthorizeView>
O que fica em cache
O framework registra nove caches como IClearableCache; a página de Administrador do Site os ordena alfabeticamente com suas descrições localizadas ao lado de cada um. As descrições estão no framework ppp-server.defaults.en.json sob app.cache-descriptions.
- TableMetadata — Metadados por tabela (colunas, tipos, opções de escolha, relacionamentos). Atualize após mudanças no esquema.
- ViewMetadata — Visualizações em cache do Dataverse (FetchXML, colunas, ordenação). Atualize após editar uma visualização no Dataverse.
- EntityMetadata — Metadados brutos da entidade Dataverse usados por código de framework de nível inferior. Mesma fonte que o TableMetadata, mas em formato diferente — normalmente resetado juntos.
- StringLocalizer — Todas as strings localizadas — etiquetas de tabelas/colunas do Dataverse, recursos web e arquivos JSON de pastas. Atualize após editar qualquer fonte de localização.
- UserPrivileges — Privilégios de segurança resolvidos por usuário (quais funções concedem quais permissões). Atualize após alterar as atribuições de funções de um usuário.
- TablePermissions — Permissões CRUD por usuário, por tabela resolvidas através da cadeia de manipuladores de permissões de tabela. Principalmente derivado do UserPrivileges for SystemUsers.
- PrivilegeMetadata — Definições de privilégios em toda a organização a partir da tabela de privilégios do Dataverse. Quase nunca muda — apenas atualizações da plataforma Dataverse introduzem novas entradas.
- OrganizationFileSettings — Configurações de upload de arquivos em nível de organização (tamanho máximo, extensões permitidas). Atualize após alterar esses no Dataverse.
- Currency — Snapshot de transação de transação em toda a organização mais a moeda base da organização. Atualize após os administradores adicionarem ou atualizarem moedas no Dataverse.
- EmailSender — Registro do remetente resolvido para e-mails de saída (busca do endereço do remetente configurado para sua referência de entidade Dataverse).
A reconstrução do StringLocalizer é a mais lenta
Limpar o cache do StringLocalizer percorre os metadados de cada tabela Dataverse + todo recurso web + cada arquivo de pastas e reconstrói o dicionário em memória. Espere 20–30 segundos contra um ambiente real. A reconstrução atômica garante que os leitores continuem vendo os valores anteriores durante toda a reconstrução — não há período em que o cache esteja vazio.
Adicionando seu próprio cache
Implemente IClearableCache e registre tanto como seu serviço de concreto quanto como IClearableCache. A página de Administrador do Site o identifica automaticamente e o renderiza alfabeticamente junto com o restante. A Name propriedade é o identificador público — é o que aparece no botão por cache.
public class MyCustomCache : IClearableCache
{
public string Name => "MyCustomCache";
public Task ClearAsync(CancellationToken cancellationToken)
{
// Abandone seu estado de memória, repovoe, etc.
return Task.CompletedTask;
}
}
// Program.cs
builder.Services.AddSingleton<MyCustomCache>();
builder.Services.AddSingleton<IClearableCache>(sp => sp.GetRequiredService<MyCustomCache>());
Descrição localizada
A página de Administrador do Site procura app.cache-descriptions.<Name> no localizador para renderizar o texto da descrição ao lado do botão. Adicione uma entrada nesse namespace no seu portal app.en.json (e em qualquer outro arquivo de idioma); páginas sem uma descrição registrada renderizam graciosamente apenas o botão.
{
"app": {
"cache-descriptions": {
"MyCustomCache": "O que esse cache contém e quando ele deve ser resetado."
}
}
}
Limpar Tudo vs. por cache
O Clear All executa todos os caches ClearAsync registrados em paralelo e reporta resultados por cache (sucesso / falha / ms decorridos) na resposta. Os botões por cache disparam do mesmo ClearAsync jeito para apenas um cache — útil quando você só precisa eliminar um (por exemplo, após editar uma única visualização do Dataverse).
Referência de API
A API de limpeza de cache permanece em IPowerPortalsProService; a orquestração subjacente que executa ClearAsync cada cache em paralelo permanece em ICacheManager. As interfaces estão resumidas abaixo.
IClearableCache Interface
Propriedades
Nome | Tipo | Padrão | Descrição |
|---|---|---|---|
Name | string | Um nome curto e estável para telemetria / feedback da interface (por exemplo, |
NameMétodos
Nome | Parâmetros | Tipo | Descrição |
|---|---|---|---|
ClearAsync | CancellationToken cancellationToken | Task | Limpa o conteúdo do cache. Para caches que mantêm dados pré-carregados (por exemplo, |
ClearAsyncICacheManager Interface
Métodos
Nome | Parâmetros | Tipo | Descrição |
|---|---|---|---|
ClearAllAsync | CancellationToken cancellationToken | Task<IReadOnlyList<CacheClearResult>> | Limpa todos os registros Services.IClearableCache em paralelo e retorna Um relatório por depósito. Um cache com falha não bloqueia os outros — sua entrada em o relatório carrega a mensagem de exceção em vez de |
ClearAsync | string name CancellationToken cancellationToken | Task<CacheClearResult> | Limpa um cache nomeado. Retornos null quando não registrado correspondência name de cache (indistinto a maiúsculas e maiúsculas). Falhas são enroladas no resultado, em vez de lançado, correspondendo Threading.CancellationToken). |
GetCacheNames | IReadOnlyList<string> | Retorna os nomes de cada registrado Services.IClearableCache, adequado para uma interface de administrador que quer renderizar botões de limpeza por cache. |
ClearAllAsyncServices.IClearableCache em paralelo e retorna Um relatório por depósito. Um cache com falha não bloqueia os outros — sua entrada em o relatório carrega a mensagem de exceção em vez de ClearAsyncCancellationToken cancellationToken
null quando não registrado correspondência name de cache (indistinto a maiúsculas e maiúsculas). Falhas são enroladas no resultado, em vez de lançado, correspondendo Threading.CancellationToken).GetCacheNamesServices.IClearableCache, adequado para uma interface de administrador que quer renderizar botões de limpeza por cache.