Licencjonowanie
Funkcje, poziomy licencji i usługa licencji
Ta strona jest odniesieniem w czasie wykonywania, jak licencja kształtuje zachowanie Doconut: co pozwala każdy stan licencji, jak przyznawane są możliwości i jak sprawdzić to wszystko w kodzie. (Aby wczytać licencję, zobacz Rozpoczęcie → Konfiguracja licencji.)
Stany licencji i ich działanie
| Stan | Otwiera dokumenty? | Znak wodny | Możliwości |
|---|---|---|---|
| Pełna (płatna) licencja (w ramach okna subskrypcji/aktualizacji) | Tak | Brak | Te zakupione (Has* flagi) |
| 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 oceny | Brak przyznanych |
| Brak pliku licencji | Tak | Znak wodny oceny | Brak przyznanych |
| Znaleziono, ale odrzucono (nieprawidłowy podpis, manipulowany, na czarnej liście lub build nowszy niż okno wersji licencji) | Nie — LicenseException | — | — |
Dwie konsekwencje warte zapamiętania:
- Brak licencji nie jest licencją tymczasową. Gdy nie ma pliku licencji, strony wyświetlają znak wodny i żadna możliwość (wyszukiwanie, adnotacje, wtyczki) nie jest aktywna. Pełna, nieoznaczona znakiem wodnym funkcjonalność wymaga rzeczywistej licencji tymczasowej (zdobądź jedną).
- Tylko odrzucona licencja blokuje otwieranie. Wygaśnięcie kalendarza/subskrypcji powoduje wyświetlanie z znakiem wodnym; ale wdrożenie builda nowszego 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 z znakiem wodnym. Ten wyjątek (zOpenDocumentAsync) zawiera powód zLicense.RejectionMessage.
Możliwości
Doconut kontroluje opcjonalną funkcjonalność za pomocą możliwości. Obecnie są to wtyczki Converter i DICOM oraz wbudowane funkcje Search i Annotation, każda przyznawana na podstawie twojej licencji. Podstawowy podgląd nie jest możliwością — jest to warunek wstępny, udostępniany jako IsViewerLicensed:
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 możliwości — 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
Licencje tymczasowe (Developer/NFR) są oznaczone tagiem ExpiryNote i posiadają sztywną datę wygaśnięcia:
| Pole | Znaczenie |
|---|---|
IsTemporary | Tag ExpiryNote jest obecny (detekcja odbywa się na podstawie obecności tagu — nigdy nie dopasowuj tekstu notatki, jest dynamiczna) |
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 samej dacie 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):
| Pole | 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 regułami poziomu powyżej |
IsVersionValid | Ten build mieści się w oknie wsparcia licencji |
IsViewerLicensed | Znaleziono plik nie będący TRIAL i wersja objęta — warunek wstępny |
IsCapabilityGranted(cap) | Jedna bramka możliwości |
HasSearch HasAnnotation HasConverter HasDicom | Flagi zakupu per‑możliwość — użyj IsCapabilityGranted dla odpowiedzi uwzględniającej tymczasowe licencje |
IsValidForDomain(host) | Pokrycie hosta; licencje V4 używają wildcard *.* |
LicenseRejectionReason | Niepusty ⇒ otwieranie jest blokowane z tym komunikatem |
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.
// 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 sprawdzenie 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 builda nowszego niż to okno powoduje, że licencja jest nieważna dla tego builda: IsVersionValid zmienia się na false i otwieranie jest blokowane z LicenseException (powód znajduje się w License.RejectionMessage) — celowo szybkie niepowodzenie, aby przestarzały lub nielicencjonowany build został wykryty przy wdrożeniu, a nie cicho znakowany w produkcji. Odnów subskrypcję, zamień plik .lic i uruchom ponownie aplikację, aby AddDoconut() wczytał nową licencję.
Czy ta strona była pomocna?