Licensiering
Funktioner, licenstier och licenstjänsten
Denna sida är referensen vid körning för hur en licens formar Doconut's beteende: vad varje licenstillstånd tillåter, hur funktioner beviljas, och hur man inspekterar allt detta från kod. (För laddning av en licens, se Licensinställning.)
Licenstillstånd och vad de gör
| Tillstånd | Öppnar dokument? | Vattenstämpel | Funktioner |
|---|---|---|---|
| Full (betald) licens (inom dess prenumerations-/uppdateringsfönster) | Ja | Ingen | De som köpts (Has* flaggor) |
| Tillfällig licens (Utvecklare/NFR — utvärderingslicensen, före dess utgångsdatum) | Ja | Ingen | Alla — generellt beviljad (utvärderingsflödet) |
| Utgången (en tillfällig licens som passerat sitt utgångsdatum, eller en betald prenumeration som passerat förnyelsedatumet) | Ja | Utvärderingsvattenstämpel | Ingen beviljad |
| Ingen licensfil alls | Ja | Utvärderingsvattenstämpel | Ingen beviljad |
| Hittad men avvisad (ogiltig signatur, manipulerad, svartlistad, eller en byggnad nyare än licensens versionsfönster) | Nej — LicenseException vid varje öppning | — | — |
Två konsekvenser värda att internalisera:
- En saknad licens är inte en tillfällig licens. Utan licensfil visas sidor med vattenstämpel och ingen funktion (sökning, annotering, plugins) är aktiv. Den fullständiga, vattenstämpelfria upplevelsen kräver en faktisk Tillfällig licens (skaffa en).
- Endast en avvisad licens blockerar öppning. Kalender-/prenumerationsutgång degraderas till renderad med vattenstämpel; men att distribuera en byggnad nyare än licensens versionsfönster avvisas och misslyckas snabbt med en
LicenseException, så du fångar den vid distribution — inte genom att tyst skicka vattenstämplad output. Undantaget (frånOpenDocumentAsync) bär med sig orsaken frånLicense.RejectionMessage.
Funktioner
Doconut styr valfri funktionalitet med funktion. Idag är det de valfria Converter- och DICOM-pluginsen plus de inbyggda Search- och Annotation-funktionerna, var och en beviljad av din licens. Basvisaren är inte en funktion — den är förutsättningen, exponerad som IsViewerLicensed:
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's versionDen enda grind som hela pipeline använder är IsCapabilityGranted:
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);Dess logik, ordagrant från implementationen: en aktiv (ej utgången) Tillfällig licens beviljar alla funktioner — inklusive funktioner som ännu inte har en dedikerad köpflagga; en riktig köpt licens beviljar exakt dess Has*-flaggor och är standard-nektande för allt som inte är mappat. (En äldre TRIAL-typ fil är inte en rättighet — den behandlas som olicensierad: vattenstämpel, inget beviljat.)
Tillfälliga licenser
Tillfälliga (Utvecklare/NFR) licenser markeras med en ExpiryNote-tagg och har ett fast utgångsdatum:
| Medlem | Betydelse |
|---|---|
IsTemporary | En ExpiryNote-tagg är närvarande (detektering sker via tagg‑närvaro — matcha aldrig notens text, den är dynamisk) |
ExpiryNote | Informationstext inbäddad i licensen |
LicenseExpiry | Det fasta utgångsdatumet (DateTime?). |
Utgångssemantiken skiljer sig per nivå: en tillfällig licens går ut på dess LicenseExpiry endast datum (dess prenumerationsfönster ignoreras; en tillfällig licens utan datum behandlas som utgången, felsäker). Alla andra licenser går ut på deras prenumerations-/uppdateringsfönster‑datum.
IDoconutLicenseService‑referens
Hämta IDoconutLicenseService (namnrymd Doconut.Core.Interfaces) från DoconutHost.Services. Det är en singleton — licensen parsas en gång, i DoconutHost.Initialize:
| Medlem | Betydelse |
|---|---|
License | Full DoconutLicenseInfo-ögonblicksbild (nedan) |
IsTrial | En äldre TRIAL‑typ fil (behandlas som olicensierad — inte en rättighet) |
IsTemporary / ExpiryNote / LicenseExpiry | Tillfällig‑licensmarkörer |
IsExpired | Utgången enligt tier‑reglerna ovan |
IsVersionValid | Denna byggnad faller inom licensens supportfönster |
IsViewerLicensed | Icke-TRIAL-fil hittad och version täckt — grundförutsättning |
IsCapabilityGranted(cap) | Den enda funktionsgrinden |
HasSearch HasAnnotation HasConverter HasDicom | Släppta per-funktionsköp‑flaggor — använd IsCapabilityGranted för svaret som tar hänsyn till tillfälliga licenser |
IsValidForDomain(host) | Värddomänstäckning; V4‑licenser använder wildcard *.* |
LicenseRejectionReason | Icke‑tom ⇒ öppning blockeras med detta meddelande |
DoconutLicenseInfo exponerar den display‑vänliga ögonblicksbilden för admin‑paneler: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, Has*‑flaggorna, de tillfälliga licensfälten och 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);
}Hälsokontroll
Doconut registrerar en "doconut"-hälsokontroll som rapporterar licenstillståndet. Classic ASP.NET har ingen egen hälsoslutpunkt, så exponera den från en 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");
}Koppla in den i din övervakning så blir en utgående prenumeration ett larm istället för en supportärende. Se DoconutHost för statusvärdena.
Versionsuppgraderingar
En licens täcker ett versionsfönster. Att uppdatera NuGet‑paketet till en byggnad nyare än det fönstret gör licensen ogiltig för denna byggnad: IsVersionValid blir false och öppning blockeras med en LicenseException (orsaken finns i License.RejectionMessage) — avsiktligt misslyckas snabbt, så en föråldrad eller olicensierad byggnad fångas vid distribution snarare än att tyst vattenstämpla produktionsoutput. Förnya prenumerationen, ersätt .lic i wwwroot, och återvinn applikationspoolen så att DoconutHost.Initialize laddar den nya licensen.
Var den här sidan hjälpsam?