Licensinställning
Var Doconut letar efter din licensfil
Utan en licens renderar Doconut fortfarande dokument — varje sida har bara ett utvärderingsvattenstämpel. Den här sidan beskriver de fyra sätten att tillhandahålla en licens, samt den exakta prioriteringen när mer än en är angiven.
Fyra sätt att tillhandahålla en licens
Det finns fyra: tre explicita källor på DoconutOptions — en ström, rått innehåll eller en filsökväg — samt automatisk upptäckt när ingen av dem är angiven. När mer än en är angiven är prioriteringen exakt:
LicenseStream slår LicenseContent slår LicensePath slår automatisk sökning.
Via sökväg
LicensePath skickas till File.Exists exakt som angivet. En relativ sökväg löses mot processens aktuella arbetskatalog — inte din projektmapp, och inte den mapp som Program.cs befinner sig i. Om sökvägen inte kan lösas kastar inte Doconut ett fel och faller inte tillbaka på automatisk sökning — den laddar helt enkelt ingen licens och visaren vattenstämplar. Automatisk sökning körs endast när ingen av LicensePath, LicenseContent eller LicenseStream är angiven. Licensfilerna per plugin i samma mapp (Doconut.Viewer.<Capability>.lic) läses med den, så LicensePath och AddPlugin<...>() fungerar tillsammans när plugin-licenserna ligger bredvid baslicensen.
Föredra en absolut sökväg (till exempel byggd från IWebHostEnvironment.WebRootPath eller AppContext.BaseDirectory), eller hoppa över LicensePath helt och hållet och förlita dig på automatisk upptäckt nedan.
builder.Services.AddDoconut(options =>
{
options.LicensePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "Doconut.Viewer.lic");
});Via ström
LicenseStream läses en gång vid start — användbart när licensen kommer från en hemlig lagring snarare än en fil på disk.
// Prioritet: LicenseStream > LicenseContent > LicensePath > automatisk sökning.
builder.Services.AddDoconut(options =>
{
options.LicenseStream = licenseStream;
});Via innehåll
LicenseContent accepterar själva licenstexten — från en miljövariabel, en databas eller en hemlig hanterare:
// License XML från en databas, miljövariabel eller secret manager —
// ingen fil på disk. Slås endast av LicenseStream.
builder.Services.AddDoconut(options =>
{
options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});Automatisk upptäckt
Konfigurera ingen av de tre explicita källorna, så söker Doconut efter licensen själv:
// Konfigurera ingenting, och Doconut söker efter licensen själv, endast i dessa två mappar:
// 1. {CurrentDirectory}/wwwroot
// 2. {AppContext.BaseDirectory}/wwwroot (wwwroot i byggutdata-mappen)
// Den söker först efter Doconut.lic, sedan Doconut.Viewer.lic, samt eventuella per‑plugin
// Doconut.Viewer.<Capability>.lic-filer bredvid den.
builder.Services.AddDoconut();De sökvägar som genomsöks, i ordning, samt filnamnen som letas efter i varje:
1. {CurrentDirectory}/wwwroot
2. {AppContext.BaseDirectory}/wwwroot
Filenames (checked in each folder above, in order):
Doconut.lic — base viewer license (checked first)
Doconut.Viewer.lic — base viewer license
Doconut.Viewer.<Capability>.lic — per-plugin license, alongside the base licenseIngenting utanför en wwwroot-mapp läses: en .lic i själva utmatningsmappen, eller i wwwroot/lib, ignoreras.
Kopiera licensen till din utmatningsmapp
När processen inte körs från projektmappen — en publicerad app, IIS, en container, en testkörning — missar den första sökningen, och den andra, {AppContext.BaseDirectory}/wwwroot, måste hitta filen. SDK:ns egna testapp kopierar licenserna dit vid varje byggnad med detta MSBuild-mål:
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
<ItemGroup>
<DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
<StaleOutputLicenses Include="$(OutDir)wwwroot\*.lic" />
</ItemGroup>
<!-- Ta bort först, så att en omdöpning eller borttagning av en .lic i wwwroot också tas bort från utdata. -->
<Delete Files="@(StaleOutputLicenses)" />
<Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)wwwroot" />
</Target>Destinationen måste vara $(OutDir)wwwroot: en .lic kopierad till utmatningsroten hittas aldrig av automatisk sökning. LicensePath-exemplen på den här sidan pekar på samma plats.
Håll
.lic-filer utanför källkontrollen — distribuera dem tillsammans med appen, eller injicera licensen viaLicenseContentellerLicenseStreamfrån din hemliga lagring.
Vad händer utan en licens
En saknad licens kastar inte ett undantag. AddDoconut() lyckas, appen startar och visaren kör — men varje sida har ett utvärderingsvattenstämpel och ingen valfri funktion beviljas.
En licensfil som hittas men avvisas är annorlunda. En ogiltig signatur, manipulering, svartlistning eller en byggnad utanför licensens versionsfönster får OpenDocumentAsync att kasta LicenseException med License.RejectionMessage. En kalenderutgången licens utan avvisningsmeddelande fortsätter i vattenstämpel‑läge.
Plugins behöver behörigheter
Att registrera en plugin utan motsvarande rättighet är annorlunda: för en saknad licens, en äldre TRIAL‑fil eller en betald licens utan den funktionen, AddDoconut() kastar InvalidOperationException, så appen startar inte. Till exempel, att registrera Converter‑pluginen utan en licens som beviljar Converter:
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.Meddelandet talar om fixen direkt: antingen ta bort options.AddPlugin<...>()‑anropet för den pluginen, eller installera en betald licens eller en aktiv Tillfällig/Demo (NFR)-licens som beviljar funktionen. Tillfälliga registreringar får överleva sitt utgångsdatum så att en redan konfigurerad app kan degraderas vid körning istället för att krascha vid omstart; när de har gått ut återkallas deras funktioner.
Verifiera den laddade licensen
Använd IDoconutLicenseService, samma sanningskälla som SDK:n använder, för att exponera en autentiserad diagnostik‑endpoint eller för att styra funktionsflaggor. Returnera inte licensinnehåll eller nycklar.
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
}));Licensen läses under AddDoconut()‑registrering. ResetLicense är för närvarande en kompatibilitetsegenskap utan aktiv omladdningsväg, så att ersätta en licensfil kräver att applikationen startas om.
Felsökningsmatris
| Symptom | Trolig orsak | Kontroll |
|---|---|---|
| Visaren fungerar men varje sida är vattenstämplad | Ingen licens laddades, eller licensen är kalenderutgången | Lös IDoconutLicenseService; verifiera utskriftskatalogen och processens arbetskatalog |
AddDoconut() kastar för en plugin | Licensen beviljar inte den pluginens funktion | Kontrollera IsCapabilityGranted(...) och ta bort registreringar du inte köpt |
| En konfigurerad relativ sökväg fungerar lokalt men inte i IIS/container | Processens arbetskatalog ändrades | Använd AppContext.BaseDirectory eller en absolut sökväg |
Ersatt .lic‑fil har ingen effekt | Den enkla licenstjänsten hade redan skapats | Starta om applikationen |
OpenDocumentAsync kastar LicenseException | Signatur, domän, versionsfönster, svartlista eller pluginens körningsgrind avvisade licensen | Läs undantags-/avvisningsmeddelandet utan att exponera det för opålitliga klienter |
Nästa steg
- Licensiering — funktioner, licenstier, och verifiera vad som laddades vid körning.
- Felsökning — vattenstämplar, avvisade licenser och funktionsfel.
Var den här sidan hjälpsam?