Licencjonowanie
Funkcje, poziomy licencji i usługa licencji
Ta strona jest odniesieniem w czasie działania, opisującym jak licencja kształtuje zachowanie Doconut: co pozwala każdy stan licencji, jak przyznawane są funkcje i jak je wszystkie sprawdzić w kodzie. (Aby załadować licencję, zobacz Rozpoczęcie → Konfiguracja licencji.)
Stany licencji i ich działanie
| Stan | Otwiera dokumenty? | Znak wodny | Funkcje |
|---|---|---|---|
| Pełna (płatna) licencja (w ramach okna subskrypcji/aktualizacji) | Tak | Brak | Te zakupione (Has* flags) |
| Licencja tymczasowa (Developer/NFR — licencja ewaluacyjna, przed datą wygaśnięcia) | Tak | Brak | Wszystkie — pełne przyznanie (kanał ewaluacji) |
| Wygasła (licencja tymczasowa po dacie wygaśnięcia lub płatna subskrypcja po dacie odnowienia) | Tak | Znak wodny ewaluacji | Brak przyznanych |
| Brak pliku licencji | Tak | Znak wodny ewaluacji | Brak przyznanych |
| Znaleziono, ale odrzucono (nieprawidłowy podpis, zmodyfikowany, na czarnej liście lub kompilacja nowsza niż okno wersji licencji) | Nie — LicenseException przy każdym otwarciu | — | — |
Dwie konsekwencje warte zapamiętania:
- Brak licencji nie jest licencją tymczasową. Gdy nie ma pliku licencji, strony wyświetlane są ze znakiem wodnym i żadna funkcja (wyszukiwanie, adnotacje, wtyczki) nie jest aktywna. Pełne, nieoznaczone znakiem wodnym doświadczenie wymaga rzeczywistej Licencji tymczasowej (pobierz ją).
- Tylko odrzucona licencja blokuje otwieranie. Wygaśnięcie kalendarza/subskrypcji powoduje jedynie renderowanie ze znakiem wodnym; natomiast wdrożenie kompilacji nowszej niż okno wersji licencji jest odrzucane i szybko kończy się niepowodzeniem z
LicenseException, więc łapiesz to przy wdrożeniu — a nie przez ciche dostarczanie wyjścia ze znakiem wodnym. Ten wyjątek (zOpenDocumentAsync) zawiera przyczynę zLicense.RejectionMessage.
Funkcje
Doconut kontroluje opcjonalną funkcjonalność za pomocą funkcji. Obecnie są to wtyczki Converter i DICOM, które można włączyć, oraz wbudowane funkcje Search i Annotation, każda przyznawana na podstawie twojej licencji. Podstawowy przeglądarka nie jest funkcją — jest wymogiem wstępnym, udostępnianym jako IsViewerLicensed:
Sprawdza, czy istnieje licencja nie‑TRIAL i obejmuje wersję tej kompilacji.
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's versionJedyną bramką, której używa cały potok, jest IsCapabilityGranted:
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);Jej logika, dosłownie z implementacji: aktywna (nieprzeterminowana) licencja tymczasowa przyznaje wszystkie funkcje — w tym te, które nie mają jeszcze dedykowanego flagi zakupu; rzeczywista zakupiona licencja przyznaje dokładnie swoje flagi Has* i ma domyślne odrzucenie dla wszystkiego, co nie jest zmapowane. (Plik typu TRIAL z przeszłości nie jest uprawnieniem — jest traktowany jako nielicencjonowany: znak wodny, nic nie przyznane.)
Licencje tymczasowe
Standardowe funkcje Search i Annotation korzystają bezpośrednio ze swoich istniejących funkcji.
Licencje tymczasowe (Developer/NFR) są oznaczone tagiem ExpiryNote i posiadają sztywną datę wygaśnięcia:
| Członek | Znaczenie |
|---|---|
IsTemporary | Tag ExpiryNote jest obecny (detekcja odbywa się na podstawie obecności tagu — nigdy nie dopasowuj tekstu notatki, jest dynamiczny) |
ExpiryNote | Informacyjny tekst wbudowany w licencję |
LicenseExpiry | Sztywna data wygaśnięcia (DateTime?) |
Semantyka wygaśnięcia różni się w zależności od poziomu: licencja tymczasowa wygasa w samą datę podaną w LicenseExpiry (okno subskrypcji jest ignorowane; licencja tymczasowa bez daty jest traktowana jako wygasła, zabezpieczenie). Wszystkie pozostałe licencje wygasają w dacie okna subskrypcji/aktualizacji.
Odniesienie do IDoconutLicenseService
Wstrzyknij IDoconutLicenseService (przestrzeń nazw Doconut.Core.Interfaces; zarejestrowany jako singleton — licencja jest parsowana raz przy uruchomieniu):
| Członek | Znaczenie |
|---|---|
License | Pełny migawkowy DoconutLicenseInfo (poniżej) |
IsTrial | Plik typu TRIAL z przeszłości (traktowany jako nielicencjonowany — nie uprawnienie) |
IsTemporary / ExpiryNote / LicenseExpiry | Markery licencji tymczasowej |
IsExpired | Wygasła zgodnie z powyższymi regułami poziomu |
IsVersionValid | Ta kompilacja mieści się w oknie wsparcia licencji |
IsViewerLicensed | Znaleziono plik nie będący TRIAL i wersja jest objęta — podstawowy wymóg |
IsCapabilityGranted(cap) | Jedyna bramka funkcji |
HasSearch HasAnnotation HasConverter HasDicom | Udostępnione flagi zakupu per‑funkcja — użyj IsCapabilityGranted dla odpowiedzi uwzględniającej licencję tymczasową |
IsValidForDomain(host) | Pokrycie hosta; licencje V4 używają maski *.* |
LicenseRejectionReason | Niepusty ⇒ otwieranie jest blokowane z tą wiadomością |
DoconutLicenseInfo udostępnia przyjazną dla wyświetlania migawkę dla paneli administracyjnych: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, flagi Has*, pola licencji tymczasowej oraz RejectionMessage.
Opisuje, jak udostępnić flagi funkcji w API, aby UI mogło się do nich odwołać.
// Feature-flag your UI from the same source of truth the SDK uses
app.MapGet("/api/features", (IDoconutLicenseService lic) => Results.Ok(new
{
viewer = lic.IsViewerLicensed || lic.IsTemporary,
search = lic.IsCapabilityGranted(LicenseCapability.Search),
annotation = lic.IsCapabilityGranted(LicenseCapability.Annotation),
conversion = lic.HasConverter,
dicom = lic.HasDicom,
}));Sprawdzenie stanu zdrowia
AddDoconut() rejestruje sprawdzanie stanu zdrowia "doconut", które raportuje stan licencji/wygaśnięcia poprzez standardowy mechanizm ASP.NET Core:
app.MapHealthChecks("/health");Podłącz to do swojego monitoringu, a wygasająca subskrypcja stanie się alertem zamiast zgłoszenia wsparcia.
Aktualizacje wersji
Licencja obejmuje okno wersji. Aktualizacja pakietu NuGet do kompilacji nowszej niż to okno powoduje, że licencja jest nieważna dla tej kompilacji: IsVersionValid przyjmuje wartość false i otwieranie jest blokowane z LicenseException (przyczyna znajduje się w License.RejectionMessage) — celowo szybkie niepowodzenie, aby przestarzała lub nielicencjonowana kompilacja została wykryta przy wdrożeniu, a nie cicho znakowana w produkcji. Odnów subskrypcję, zamień plik .lic i uruchom ponownie aplikację, aby AddDoconut() załadował nową licencję.
Czy ta strona była pomocna?