Licenciamento
Recursos, níveis de licença e o serviço de licença
Esta página é a referência em tempo de execução de como uma licença molda o comportamento do Doconut: o que cada estado de licença permite, como os recursos são concedidos e como inspecionar tudo isso a partir do código. (Para carregar uma licença, veja Configuração de Licença.)
Estados da licença e o que eles fazem
| Estado | Abre documentos? | Marca d'água | Recursos |
|---|---|---|---|
| Licença completa (paga) (dentro da sua janela de assinatura/atualização) | Sim | Nenhuma | As adquiridas (Has* flags) |
| Licença temporária (Desenvolvedor/NFR — a licença de avaliação, antes da data de expiração) | Sim | Nenhuma | Todas — concessão geral (o funil de avaliação) |
| Expirada (uma licença temporária após sua data de expiração, ou uma assinatura paga após sua data de renovação) | Sim | Marca d'água de avaliação | Nenhum concedido |
| Nenhum arquivo de licença | Sim | Marca d'água de avaliação | Nenhum concedido |
| Encontrada, mas rejeitada (assinatura inválida, adulterada, na lista negra, ou uma compilação mais nova que a janela de versão da licença) | Não — LicenseException em cada abertura | — | — |
Dois pontos importantes a internalizar:
- Uma licença ausente não é uma licença temporária. Sem arquivo de licença, as páginas são renderizadas com marca d'água e nenhum recurso (pesquisa, anotação, plugins) está ativo. A experiência completa, sem marca d'água, requer uma Licença temporária (obtenha uma).
- Somente uma licença rejeitada bloqueia a abertura. O vencimento do calendário/assinatura regride para renderização com marca d'água; mas implantar uma compilação mais nova que a janela de versão da licença é rejeitado e falha rapidamente com uma
LicenseException, de modo que você a captura no deploy — não ao enviar silenciosamente saída com marca d'água. Essa exceção (deOpenDocumentAsync) contém a razão deLicense.RejectionMessage.
Recursos
Doconut controla funcionalidades opcionais por recurso. Hoje são os plugins opcionais Converter e DICOM, além dos recursos integrados Pesquisa e Anotação, cada um concedido pela sua licença. O visualizador base não é um recurso — ele é o pré-requisito, exposto como IsViewerLicensed:
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's versionO único ponto de verificação que todo o pipeline usa é IsCapabilityGranted:
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);Sua lógica, palavra por palavra da implementação: uma licença temporária ativa (não expirada) concede todos os recursos — incluindo recursos que ainda não possuem uma flag de compra dedicada; uma licença realmente comprada concede exatamente suas flags Has* e tem negação padrão para qualquer coisa não mapeada. (Um arquivo legado do tipo TRIAL não é um direito — ele é tratado como não licenciado: com marca d'água, nada concedido.)
Licenças temporárias
Licenças temporárias (Desenvolvedor/NFR) são marcadas por uma tag ExpiryNote e possuem uma data de expiração fixa:
| Membro | Significado |
|---|---|
IsTemporary | Uma tag ExpiryNote está presente (a detecção é pela presença da tag — nunca compare o texto da nota, é dinâmico) |
ExpiryNote | Texto informativo embutido na licença |
LicenseExpiry | A data de expiração fixa (DateTime?) |
A semântica de expiração difere por nível: uma licença temporária expira apenas na data de LicenseExpiry (sua janela de assinatura é ignorada; uma licença temporária sem data é tratada como expirada, como medida de segurança). Todas as demais licenças expiram na data da sua janela de assinatura/atualização.
Referência IDoconutLicenseService
Resolva IDoconutLicenseService (namespace Doconut.Core.Interfaces) a partir de DoconutHost.Services. É um singleton — a licença é analisada uma única vez, em DoconutHost.Initialize:
| Membro | Significado |
|---|---|
License | Captura completa de DoconutLicenseInfo (abaixo) |
IsTrial | Um arquivo legado do tipo TRIAL (tratado como não licenciado — não um direito) |
IsTemporary / ExpiryNote / LicenseExpiry | Marcadores de licença temporária |
IsExpired | Expirada de acordo com as regras de nível acima |
IsVersionValid | Esta compilação está dentro da janela de suporte da licença |
IsViewerLicensed | Arquivo não-TRIAL encontrado e versão coberta — pré-requisito base |
IsCapabilityGranted(cap) | O único ponto de verificação de recurso |
HasSearch HasAnnotation HasConverter HasDicom | Flags de compra por recurso — use IsCapabilityGranted para a resposta que considera temporárias |
IsValidForDomain(host) | Cobertura de host; licenças V4 usam o curinga *.* |
LicenseRejectionReason | Não vazio ⇒ a abertura é bloqueada com esta mensagem |
DoconutLicenseInfo expõe a captura amigável para exibição em painéis administrativos: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, as flags Has*, os campos de licença temporária e RejectionMessage.
// GET /Features - feature-flag your UI from the same source of truth the SDK uses
public ActionResult Index()
{
var lic = Doconut.DoconutHost.Services.GetRequiredService<IDoconutLicenseService>();
return Json(new
{
viewer = lic.IsViewerLicensed || lic.IsTemporary,
search = lic.IsCapabilityGranted(LicenseCapability.Search),
annotation = lic.IsCapabilityGranted(LicenseCapability.Annotation),
conversion = lic.HasConverter,
dicom = lic.HasDicom,
}, JsonRequestBehavior.AllowGet);
}Verificação de saúde
Doconut registra uma verificação de saúde "doconut" que relata o estado da licença. O Classic ASP.NET não possui um endpoint de saúde próprio, então exponha-a a partir de um controller:
// GET /Health - Doconut registers a "doconut" health check that reports the license state:
// Healthy (valid), Degraded (trial or no license file), Unhealthy (expired).
public async Task<ActionResult> Index()
{
var health = Doconut.DoconutHost.Services.GetRequiredService<HealthCheckService>();
HealthReport report = await health.CheckHealthAsync();
Response.StatusCode = report.Status == HealthStatus.Unhealthy ? 503 : 200;
return Content(report.Status.ToString(), "text/plain");
}Integre-a ao seu monitoramento e uma assinatura que está expirando se tornará um alerta em vez de um ticket de suporte. Veja DoconutHost para os valores de status.
Atualizações de versão
Uma licença cobre uma janela de versão. Atualizar o pacote NuGet para uma compilação mais nova que essa janela torna a licença inválida para essa compilação: IsVersionValid passa a false e a abertura é bloqueada com uma LicenseException (a razão está em License.RejectionMessage) — falha rápida deliberada, para que uma compilação obsoleta ou não licenciada seja detectada no deploy em vez de marcar silenciosamente a produção com marca d'água. Renove a assinatura, substitua o .lic em wwwroot e recicle o pool de aplicativos para que DoconutHost.Initialize carregue a nova licença.
Esta página foi útil?