Nastavení licence

Kde Doconut hledá váš licenční soubor

Bez licence Doconut stále vykresluje dokumenty — každá stránka nese evaluační vodoznak. Tato stránka popisuje čtyři způsoby, jak dodat licenci, a přesné pořadí přednosti, když je nastaveno více než jedno.

Čtyři způsoby, jak dodat licenci

Existují čtyři: tři explicitní zdroje v DoconutOptions — proud, surový obsah nebo cesta k souboru — plus automatické vyhledávání, když není žádný z nich nastaven. Když je nastaveno více než jedno, pořadí přednosti je přesně následující:

LicenseStream má přednost před LicenseContent, který má přednost před LicensePath, který má přednost před automatickým vyhledáváním.

Podle cesty

LicensePath se předává File.Exists přesně tak, jak je zadáno. Relativní cesta se vyhodnocuje vůči aktuálnímu pracovnímu adresáři procesu — ne k vašemu projektovému adresáři a ne k adresáři, ve kterém žije Program.cs. Pokud se cesta nevyřeší, Doconut nevyhodí výjimku a nepřepne na automatické vyhledávání — jednoduše nenačte žádnou licenci a viewer zobrazí vodoznak. Automatické vyhledávání běží jen tehdy, když není nastaveno LicensePath, LicenseContent ani LicenseStream.

Upřednostněte absolutní cestu (například vytvořenou z IWebHostEnvironment.WebRootPath nebo AppContext.BaseDirectory), nebo úplně vynechte LicensePath a spolehněte se na automatické vyhledávání níže.

csharp
builder.Services.AddDoconut(options =>
{
    options.LicensePath = Path.Combine(AppContext.BaseDirectory, "Doconut.Viewer.lic");
});

Podle proudu

LicenseStream se načte jednou při startu — užitečné, když licence pochází z tajného úložiště místo souboru na disku.

csharp
// Precedence: LicenseStream > LicenseContent > LicensePath > auto-search.
builder.Services.AddDoconut(options =>
{
    options.LicenseStream = licenseStream;
});

Podle obsahu

LicenseContent přijímá samotný text licence — z proměnné prostředí, databáze nebo správce tajemství:

csharp
// License XML from a database, environment variable, or secret manager —
// no file on disk. Beaten only by LicenseStream.
builder.Services.AddDoconut(options =>
{
    options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});

Automatické vyhledávání

Nenastavte žádný ze tří explicitních zdrojů a Doconut sám vyhledá licenci:

csharp
// Configure nothing, and Doconut searches for the license itself:
//   1. {CurrentDirectory}/wwwroot
//   2. {CurrentDirectory}/wwwroot/lib
//   3. AppContext.BaseDirectory  (the build output folder)
// It looks for Doconut.Viewer.lic plus any per-plugin
// Doconut.Viewer.<Capability>.lic files alongside it.
builder.Services.AddDoconut();

Probingové adresáře v pořadí a názvy souborů, které se v nich hledají:

text
1. {CurrentDirectory}/wwwroot
2. {CurrentDirectory}/wwwroot/lib
3. AppContext.BaseDirectory

Filenames (checked in each directory above, in order):
  Doconut.Viewer.lic                   — base viewer license
  Doconut.Viewer.<Capability>.lic      — per-plugin license, alongside Doconut.Viewer.lic

Zkopírujte licenci do výstupního adresáře

LicensePath i probing AppContext.BaseDirectory při automatickém vyhledávání vyžadují, aby soubor .lic existoval vedle sestavené aplikace — ne jen ve vašem zdrojovém wwwroot. Testovací aplikace SDK tento soubor při každém buildu zkopíruje pomocí následujícího MSBuild targetu:

xml
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
  <ItemGroup>
    <DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
  </ItemGroup>
  <Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
</Target>

Uchovávejte soubory .lic mimo správu verzí — nasazujte je vedle aplikace, nebo injektujte licenci přes LicenseContent či LicenseStream z vašeho tajného úložiště.

Co se stane bez licence

Chybějící licence nevyvolá výjimku. AddDoconut() uspěje, aplikace se spustí a viewer běží — ale každá stránka nese evaluační vodoznak a žádná volitelná funkce není povolena.

Licenční soubor, který je nalezen, ale odmítnut, je jiná situace. Neplatný podpis, manipulace, blacklist, nebo sestavení mimo časové okno licence způsobí, že OpenDocumentAsync vyhodí LicenseException s License.RejectionMessage. Licence, která vypršela kalendářově, ale nemá odmítací zprávu, pokračuje v režimu s vodoznakem.

Pluginy potřebují oprávnění

Registrace pluginu bez odpovídajícího oprávnění je odlišná: při chybějící licenci, starém souboru TRIAL nebo placené licenci bez dané funkce AddDoconut() vyhodí InvalidOperationException, takže se aplikace nespustí. Například registrace pluginu Converter bez licence, která poskytuje Converter:

text
InvalidOperationException: The Converter plugin is registered via AddPlugin but no active
license grants Converter. Remove the AddPlugin<...>() call or install a license (or
trial/demo) that includes Converter.

Zpráva vám říká, jak opravit situaci: buď odeberete volání options.AddPlugin<...>() pro daný plugin, nebo nainstalujete placenou licenci či aktivní dočasnou/Demo (NFR) licenci, která danou funkci poskytuje. Dočasné registrace mohou přežít datum expirace, takže již nakonfigurovaná aplikace může při běhu degradovat místo toho, aby se při restartu zhroutila; po expiraci jsou jejich oprávnění stále odebrána.

Ověřte načtenou licenci

Použijte IDoconutLicenseService, stejný zdroj pravdy, který SDK používá, k vystavení autentizovaného diagnostického endpointu nebo k řízení feature flagů. Neukazujte obsah licence ani klíče.

csharp
app.MapGet("/api/doconut/license", (IDoconutLicenseService license) => Results.Ok(new
{
    viewer = license.IsViewerLicensed || license.IsTemporary,
    temporary = license.IsTemporary,
    search = license.IsCapabilityGranted(LicenseCapability.Search),
    annotation = license.IsCapabilityGranted(LicenseCapability.Annotation),
    converter = license.HasConverter,
    dicom = license.HasDicom
}));

Licence se načítá během registrace AddDoconut(). ResetLicense je momentálně jen kompatibilní vlastnost bez aktivní cesty pro opětovné načtení, takže výměna licenčního souboru vyžaduje restart aplikace.

Matrice řešení problémů

PříznakPravděpodobná příčinaKontrola
Viewer funguje, ale každá stránka je vodoznakovánaNebyla načtena žádná licence nebo je licence kalendářově prošláVyřešte IDoconutLicenseService; ověřte výstupní adresář a pracovní adresář procesu
AddDoconut() vyhazuje výjimku pro pluginLicence nepřiděluje oprávnění tomuto pluginuZkontrolujte IsCapabilityGranted(...) a odstraňte registrace, které jste nezakoupili
Nakonfigurovaná relativní cesta funguje lokálně, ale ne v IIS/kontejneruPracovní adresář procesu se změnilPoužijte AppContext.BaseDirectory nebo absolutní cestu
Vyměněný soubor .lic nemá žádný efektSingletonová licenční služba již byla vytvořenaRestartujte aplikaci
OpenDocumentAsync vyhazuje LicenseExceptionPodpis, doména, časové okno verze, blacklist nebo runtime gate pluginu odmítly licenciPřečtěte zprávu výjimky/odmítnutí, aniž byste ji vystavili nedůvěryhodným klientům

Další kroky

  • Licencování — schopnosti, úrovně licencí a ověření, co bylo načteno za běhu.
  • Řešení problémů — vodoznaky, odmítnuté licence a chyby oprávnění.

Byla tato stránka užitečná?