Konfiguracja licencji

Gdzie Doconut szuka pliku licencji

Bez licencji Doconut nadal renderuje dokumenty — każda strona zawiera znak wodny oceny. Ta strona opisuje cztery sposoby dostarczenia licencji oraz dokładny priorytet, gdy ustawionych jest więcej niż jeden.

Cztery sposoby dostarczenia licencji

Istnieją cztery: trzy explicite źródła w DoconutOptions — strumień, surowa treść lub ścieżka pliku — oraz automatyczne wykrywanie, gdy żadne z nich nie jest ustawione. Gdy ustawionych jest więcej niż jedno, priorytet jest następujący:

LicenseStream przeważa nad LicenseContent przeważa nad LicensePath przeważa nad automatycznym wyszukiwaniem.

Według ścieżki

LicensePath jest przekazywany do File.Exists dokładnie tak, jak podano. Ścieżka względna jest rozwiązywana względem bieżącego katalogu roboczego procesu — nie folderu projektu, ani folderu, w którym znajduje się Program.cs. Jeśli ścieżka nie zostanie znaleziona, Doconut nie zgłasza wyjątku i nie przechodzi do automatycznego wyszukiwania — po prostu nie ładuje licencji i podgląd zostaje oznaczony znakiem wodnym. Automatyczne wyszukiwanie działa tylko wtedy, gdy żadne z LicensePath, LicenseContent lub LicenseStream nie jest ustawione. Pliki licencji per‑plugin w tym samym folderze (Doconut.Viewer.<Capability>.lic) są odczytywane razem z nim, więc LicensePath i AddPlugin<...>() współdziałają, gdy licencje wtyczek znajdują się obok głównej licencji.

Preferuj ścieżkę bezwzględną (na przykład zbudowaną z IWebHostEnvironment.WebRootPath lub AppContext.BaseDirectory), lub całkowicie pomiń LicensePath i polegaj na automatycznym wykrywaniu poniżej.

csharp
builder.Services.AddDoconut(options =>
{
    options.LicensePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "Doconut.Viewer.lic");
});

Za pomocą strumienia

LicenseStream jest odczytywany raz przy uruchomieniu — przydatny, gdy licencja pochodzi z tajnego magazynu zamiast z pliku na dysku.

csharp
// Priorytet: LicenseStream > LicenseContent > LicensePath > automatyczne wyszukiwanie.
builder.Services.AddDoconut(options =>
{
    options.LicenseStream = licenseStream;
});

Za pomocą treści

LicenseContent przyjmuje samą treść licencji — z zmiennej środowiskowej, bazy danych lub menedżera tajemnic:

csharp
// XML licencji z bazy danych, zmiennej środowiskowej lub menedżera tajemnic —
// brak pliku na dysku. Pokonany tylko przez LicenseStream.
builder.Services.AddDoconut(options =>
{
    options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});

Automatyczne wykrywanie

Nie skonfiguruj żadnego z trzech explicite źródeł, a Doconut sam wyszuka licencję:

csharp
// Nie konfiguruj nic, a Doconut wyszukuje licencję samodzielnie, tylko w tych dwóch folderach:
//   1. {CurrentDirectory}/wwwroot
//   2. {AppContext.BaseDirectory}/wwwroot   (wwwroot wewnątrz folderu wyjściowego kompilacji)
// Najpierw szuka Doconut.lic, potem Doconut.Viewer.lic, oraz wszelkich per-plugin
// Pliki Doconut.Viewer.<Capability>.lic obok niego.
builder.Services.AddDoconut();

Foldery przeszukiwane, w kolejności, oraz nazwy plików poszukiwane w każdym z nich:

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

Nic poza folderem wwwroot nie jest odczytywane: .lic w samym folderze wyjściowym lub w wwwroot/lib jest ignorowane.

Skopiuj licencję do folderu wyjściowego

Gdy proces nie jest uruchamiany z folderu projektu — opublikowana aplikacja, IIS, kontener, uruchamiacz testów — pierwsze przeszukanie nie znajduje pliku, a drugie, {AppContext.BaseDirectory}/wwwroot, musi go odnaleźć. Testowa aplikacja SDK kopiuje licencje tam przy każdym kompilowaniu przy użyciu tego celu MSBuild:

xml
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
  <ItemGroup>
    <DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
    <StaleOutputLicenses Include="$(OutDir)wwwroot\*.lic" />
  </ItemGroup>
  <!-- Najpierw usuń, aby zmiana nazwy lub usunięcie pliku .lic w wwwroot również usunęło go z wyjścia. -->
  <Delete Files="@(StaleOutputLicenses)" />
  <Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)wwwroot" />
</Target>

Miejsce docelowe musi być $(OutDir)wwwroot: .lic skopiowany do korzenia wyjścia nigdy nie zostanie znaleziony przez automatyczne wyszukiwanie. Przykłady LicensePath na tej stronie wskazują to samo miejsce.

Trzymaj pliki .lic poza kontrolą wersji — wdrażaj je razem z aplikacją lub wstrzykuj licencję przez LicenseContent lub LicenseStream z twojego magazynu tajemnic.

Co się dzieje bez licencji

Brak licencji nie powoduje wyjątku. AddDoconut() kończy się sukcesem, aplikacja się uruchamia, a przeglądarka działa — ale każda strona zawiera znak wodny oceny i nie przyznano żadnej opcjonalnej funkcji.

Plik licencji, który zostaje znaleziony, ale odrzucony, jest inny. Nieprawidłowy podpis, manipulacja, czarna lista lub kompilacja poza oknem wersji licencji powodują, że OpenDocumentAsync rzuca LicenseException z License.RejectionMessage. Licencja wygasła kalendarzowo, która nie ma komunikatu odrzucenia, kontynuuje działanie w trybie znakowanym.

Wtyczki wymagają uprawnień

Rejestrowanie wtyczki bez odpowiedniego uprawnienia jest inne: w przypadku brakującej licencji, starszego pliku TRIAL lub płatnej licencji bez tej funkcji, AddDoconut() rzuca InvalidOperationException, więc aplikacja się nie uruchamia. Na przykład, rejestracja wtyczki Converter bez licencji, która przyznaje 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.

Komunikat podaje rozwiązanie bezpośrednio: usuń wywołanie options.AddPlugin<...>() dla tej wtyczki lub zainstaluj płatną licencję albo aktywną licencję Tymczasową/Demonstracyjną (NFR), która przyznaje tę funkcję. Rejestracje tymczasowe mogą przetrwać datę wygaśnięcia, dzięki czemu już skonfigurowana aplikacja może degradować się w czasie działania zamiast awarii przy ponownym uruchomieniu; po wygaśnięciu ich uprawnienia są nadal cofane.

Zweryfikuj załadowaną licencję

Użyj IDoconutLicenseService, tego samego źródła prawdy używanego przez SDK, aby udostępnić uwierzytelniony punkt diagnostyczny lub sterować flagami funkcji. Nie zwracaj treści licencji ani kluczy.

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

Licencja jest odczytywana podczas rejestracji AddDoconut(). ResetLicense jest obecnie właściwością kompatybilności bez aktywnej ścieżki przeładowania, więc zastąpienie pliku licencji wymaga ponownego uruchomienia aplikacji.

Macierz rozwiązywania problemów

ObjawPrawdopodobna przyczynaSprawdź
Przeglądarka działa, ale każda strona jest znakowanaNie załadowano licencji lub licencja wygasła kalendarzowoRozwiąż IDoconutLicenseService; zweryfikuj katalog wyjściowy i katalog roboczy procesu
AddDoconut() zgłasza wyjątek dla wtyczkiLicencja nie przyznaje tej funkcji wtyczkiSprawdź IsCapabilityGranted(...) i usuń rejestracje, których nie zakupiłeś
Skonfigurowana ścieżka względna działa lokalnie, ale nie w IIS/kontenerzeKatalog roboczy procesu został zmienionyUżyj AppContext.BaseDirectory lub ścieżki bezwzględnej
Zastąpiony plik .lic nie wywiera żadnego efektuUsługa licencji singleton została już utworzonaUruchom ponownie aplikację
OpenDocumentAsync zgłasza LicenseExceptionPodpis, domena, okno wersji, czarna lista lub bramka czasu wykonania wtyczki odrzuciły licencjęOdczytaj komunikat wyjątku/odrzucenia bez udostępniania go nieufnym klientom

Kolejne kroki

  • Licencjonowanie — możliwości, poziomy licencji i weryfikacja tego, co zostało załadowane w czasie działania.
  • Rozwiązywanie problemów — znaki wodne, odrzucone licencje i błędy uprawnień.

Czy ta strona była pomocna?