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 täcker de fyra sätten att tillhandahålla en licens, och den exakta prioriteringen när mer än en är inställd.

Licensen laddas en gång, under AddDoconut(). Det är en förändring från det tidigare .NET Standard-biblioteket, där licensen gavs till en Viewer-instans eller ställdes via de statiska anropen Viewer.DoconutLicense(...) / Viewer.SetLicensePlugin(...). Dessa metoder är inte en startmekanism i denna version — se migrationsguiden.

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 inställd. När mer än en är inställd är prioriteringen exakt:

LicenseStream slår LicenseContent slår LicensePath slår auto-search.

Via sökväg

LicensePath skickas till File.Exists exakt som den är. En relativ sökväg löses mot processens aktuella arbetskatalog — inte din projektmapp, och inte den mapp där Program.cs finns. Om sökvägen inte kan lösas kastar Doconut inte ett undantag och faller inte tillbaka på automatisk sökning — den laddar helt enkelt ingen licens och visaren visar vattenstämplar. Automatisk sökning körs endast när ingen av LicensePath, LicenseContent eller LicenseStream är inställd. 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.

csharp
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.

csharp
// Prioritet: LicenseStream > LicenseContent > LicensePath > auto-search.
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:

csharp
// Licens-XML från en databas, miljövariabel eller hemlig hanterare —
// 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:

csharp
// 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 letar först efter Doconut.lic, sedan Doconut.Viewer.lic, samt eventuella per-funktionalitets
// Doconut.Viewer.<Capability>.lic-filer bredvid den.
builder.Services.AddDoconut();

De sökmappar som genomsöks, i ordning, samt filnamnen som letas efter i varje:

text
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-capability license, alongside the base license

Ingenting utanför en wwwroot-mapp läses: en .lic i själva utdata-mappen, eller i wwwroot/lib, ignoreras.

Om du tidigare skickade en List<string> med licenssökvägar till Viewer-konstruktorn — en per funktionalitet — behåll dessa medföljande filer bredvid Doconut.Viewer.lic och låt automatisk upptäckt plocka upp dem. Det finns inget alternativ för lista med sökvägar i DoconutOptions.

Kopiera licensen till din utdata‑mapp

När processen inte körs från projektmappen — en publicerad app, IIS, en container, en testkörare — 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:

xml
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
  <ItemGroup>
    <DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
    <StaleOutputLicenses Include="$(OutDir)wwwroot\*.lic" />
  </ItemGroup>
  <!-- Ta bort först, så att en namnändring eller borttagning av en .lic i wwwroot också tas bort från outputen. -->
  <Delete Files="@(StaleOutputLicenses)" />
  <Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)wwwroot" />
</Target>

Destinationen måste vara $(OutDir)wwwroot: en .lic som kopieras till utdata‑roten hittas aldrig av autosökning. LicensePath‑exemplen på den här sidan pekar på samma plats.

Håll .lic‑filer utanför versionskontrollen — distribuera dem tillsammans med appen, eller injicera licensen via LicenseContent eller LicenseStream från din hemliga lagring.

Vad händer utan licens

En saknad licens kastar inte ett undantag. AddDoconut() lyckas, appen startar, och visaren kör — men varje sida får ett utvärderings‑vattenstä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 som saknar avvisningsmeddelande fortsätter i vattenmärkt läge.

Plugins behöver funktioner

Att registrera en plugin utan motsvarande rättighet är annorlunda: för en saknad licens, en legacy TRIAL‑fil, eller en betald licens utan den funktionen, kastar AddDoconut() InvalidOperationException, så appen startar inte. Till exempel, att registrera Converter‑pluginen utan en licens som beviljar 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.

Meddelandet talar om för dig hur du åtgärdar det direkt: antingen ta bort anropet options.AddPlugin<...>() för den pluginen, eller installera en betald licens eller en aktiv Temporary/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.

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
}));

Licensen läses under registreringen av AddDoconut(). 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

SymptomTrolig orsakKontrollera
Visaren fungerar men varje sida är vattenmärktIngen licens laddades, eller licensen är kalenderutgångenLös IDoconutLicenseService; verifiera utdata‑katalogen och processens arbetskatalog
AddDoconut() kastar för en pluginLicensen beviljar inte den plugin‑funktionenKontrollera IsCapabilityGranted(...) och ta bort registreringar du inte har köpt
En konfigurerad relativ sökväg fungerar lokalt men inte i IIS/containerProcessens arbetskatalog har ändratsAnvänd AppContext.BaseDirectory eller en absolut sökväg
Ersatt .lic‑fil har ingen effektDen enkla licenstjänsten hade redan skapatsStarta om applikationen
OpenDocumentAsync kastar LicenseExceptionSignatur, domän, versionsfönster, svartlista eller plugin‑körningsgrind avvisade licensenLäs undantags‑/avvisningsmeddelandet utan att exponera det för opålitliga klienter
En per‑funktion‑licens fungerade tidigare men fungerar inte nuDen gamla koden skickade explicita licensvägar till Viewer‑konstruktornFlytta de medföljande .lic‑filerna bredvid Doconut.Viewer.lic och låt automatisk upptäckt ladda dem

Nästa steg

  • Licensiering — funktioner, licenstier och verifiering av vad som laddades vid körning.
  • Felsökning — vattenstämplar, avvisade licenser och funktionsfel.

Var den här sidan hjälpsam?