Pengaturan Lisensi
Di mana Doconut mencari file lisensi Anda
Tanpa lisensi, Doconut tetap merender dokumen — setiap halaman hanya menampilkan watermark evaluasi. Halaman ini menjelaskan empat cara menyediakan lisensi, serta prioritas tepat ketika lebih dari satu diatur.
Empat cara menyediakan lisensi
Ada empat: tiga sumber eksplisit pada DoconutOptions — aliran, konten mentah, atau jalur file — serta penemuan otomatis ketika tidak ada yang diatur. Ketika lebih dari satu diatur, prioritasnya tepat:
LicenseStream mengalahkan LicenseContent mengalahkan LicensePath mengalahkan pencarian otomatis.
Dengan jalur
LicensePath diteruskan ke File.Exists persis seperti yang diberikan. Jalur relatif diresolusikan terhadap direktori kerja saat ini proses — bukan folder proyek Anda, dan bukan folder tempat Program.cs berada. Jika jalur tidak dapat diresolusikan, Doconut tidak melempar kesalahan dan tidak kembali ke pencarian otomatis — ia hanya tidak memuat lisensi apa pun dan penampil menambahkan watermark. Pencarian otomatis hanya dijalankan ketika tidak ada LicensePath, LicenseContent, atau LicenseStream yang diatur. Berkas lisensi per‑plugin di folder yang sama (Doconut.Viewer.<Capability>.lic) dibaca bersamanya, sehingga LicensePath dan AddPlugin<...>() bekerja bersama ketika lisensi plugin berada di samping lisensi dasar.
Lebih baik gunakan jalur absolut (misalnya dibangun dari IWebHostEnvironment.WebRootPath atau AppContext.BaseDirectory), atau lewati LicensePath sepenuhnya dan bergantung pada penemuan otomatis di bawah.
builder.Services.AddDoconut(options =>
{
options.LicensePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "Doconut.Viewer.lic");
});Dengan aliran
LicenseStream dibaca sekali saat startup — berguna ketika lisensi berasal dari penyimpanan rahasia alih‑alih file di disk.
// Prioritas: LicenseStream > LicenseContent > LicensePath > pencarian otomatis.
builder.Services.AddDoconut(options =>
{
options.LicenseStream = licenseStream;
});Dengan konten
LicenseContent menerima teks lisensi itu sendiri — dari variabel lingkungan, basis data, atau manajer rahasia:
// License XML dari basis data, variabel lingkungan, atau pengelola rahasia —
// tidak ada file di disk. Hanya dikalahkan oleh LicenseStream.
builder.Services.AddDoconut(options =>
{
options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});Penemuan otomatis
Tidak mengonfigurasi salah satu dari tiga sumber eksplisit, dan Doconut mencari lisensi secara otomatis:
// Tidak mengkonfigurasi apa pun, dan Doconut mencari lisensi sendiri, hanya di dua folder ini:
// 1. {CurrentDirectory}/wwwroot
// 2. {AppContext.BaseDirectory}/wwwroot (wwwroot di dalam folder output build)
// Ia mencari Doconut.lic terlebih dahulu, kemudian Doconut.Viewer.lic, plus semua per-plugin
// File Doconut.Viewer.<Capability>.lic di sampingnya.
builder.Services.AddDoconut();Folder penyelidikan, dalam urutan, dan nama berkas yang dicari di masing‑masing:
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 licenseTidak ada yang dibaca di luar folder wwwroot: sebuah .lic di folder output itu sendiri, atau di wwwroot/lib, diabaikan.
Salin lisensi ke folder output Anda
Ketika proses tidak dijalankan dari folder proyek — aplikasi yang dipublikasikan, IIS, kontainer, atau test runner — penyelidikan pertama tidak menemukan, dan yang kedua, {AppContext.BaseDirectory}/wwwroot, harus menemukan berkas tersebut. Aplikasi uji SDK sendiri menyalin lisensi ke sana pada setiap build dengan target MSBuild ini:
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
<ItemGroup>
<DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
<StaleOutputLicenses Include="$(OutDir)wwwroot\*.lic" />
</ItemGroup>
<!-- Hapus terlebih dahulu, sehingga mengganti nama atau menghapus .lic di wwwroot juga mengeluarkannya dari output. -->
<Delete Files="@(StaleOutputLicenses)" />
<Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)wwwroot" />
</Target>Tujuan harus $(OutDir)wwwroot: sebuah .lic yang disalin ke akar output tidak pernah ditemukan oleh pencarian otomatis. Contoh LicensePath pada halaman ini mengarah ke tempat yang sama.
Jaga agar berkas
.lictidak masuk ke kontrol sumber — menyebarkan mereka bersama aplikasi, atau sisipkan lisensi melaluiLicenseContentatauLicenseStreamdari penyimpanan rahasia Anda.
Apa yang terjadi tanpa lisensi
Lisensi yang hilang tidak menyebabkan pengecualian. AddDoconut() berhasil, aplikasi dimulai, dan penampil berjalan — tetapi setiap halaman memiliki watermark evaluasi dan tidak ada kemampuan opsional yang diberikan.
File lisensi yang ditemukan tetapi ditolak berbeda. Tanda tangan yang tidak valid, manipulasi, pemblokiran, atau build di luar jendela versi lisensi menyebabkan OpenDocumentAsync melempar LicenseException dengan License.RejectionMessage. Lisensi yang kedaluwarsa secara kalender tanpa pesan penolakan tetap beroperasi dalam mode berwatermark.
Plugin membutuhkan kemampuan
Mendaftarkan plugin tanpa hak yang sesuai berbeda: untuk lisensi yang hilang, file legacy TRIAL, atau lisensi berbayar tanpa kemampuan tersebut, AddDoconut() melempar InvalidOperationException, sehingga aplikasi tidak dapat dimulai. Misalnya, mendaftarkan plugin Converter tanpa lisensi yang memberikan Converter:
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.Pesan tersebut memberi tahu Anda perbaikan secara langsung: hapus panggilan options.AddPlugin<...>() untuk plugin itu, atau instal lisensi berbayar atau lisensi Temporary/Demo (NFR) yang aktif yang memberikan kemampuan tersebut. Pendaftaran sementara diizinkan bertahan melewati tanggal kedaluwarsa sehingga aplikasi yang sudah dikonfigurasi dapat menurun fungsinya pada runtime alih-alih crash saat restart; setelah kedaluwarsa, kemampuan mereka tetap dicabut.
Verifikasi lisensi yang dimuat
Gunakan IDoconutLicenseService, sumber kebenaran yang sama digunakan oleh SDK, untuk mengekspos endpoint diagnostik yang terautentikasi atau untuk mengendalikan flag fitur. Jangan mengembalikan isi lisensi atau kunci.
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
}));Lisensi dibaca selama pendaftaran AddDoconut(). ResetLicense saat ini merupakan properti kompatibilitas tanpa jalur muat ulang aktif, sehingga mengganti file lisensi memerlukan restart aplikasi.
Matriks pemecahan masalah
| Gejala | Penyebab kemungkinan | Periksa |
|---|---|---|
| Penampil berfungsi tetapi setiap halaman berwatermark | Tidak ada lisensi yang dimuat, atau lisensi kedaluwarsa secara kalender | Selesaikan IDoconutLicenseService; verifikasi direktori output dan direktori kerja proses |
AddDoconut() melempar untuk sebuah plugin | Lisensi tidak memberikan kemampuan plugin tersebut | Periksa IsCapabilityGranted(...) dan hapus pendaftaran yang tidak Anda beli |
| Jalur relatif yang dikonfigurasi berfungsi secara lokal tetapi tidak di IIS/container | Direktori kerja proses berubah | Gunakan AppContext.BaseDirectory atau jalur absolut |
File .lic yang diganti tidak berpengaruh | Layanan lisensi singleton sudah dibuat | Restart aplikasi |
OpenDocumentAsync melempar LicenseException | Tanda tangan, domain, jendela versi, daftar hitam, atau gerbang runtime plugin menolak lisensi | Baca pesan pengecualian/penolakan tanpa mengeksposnya ke klien yang tidak tepercaya |
Langkah selanjutnya
- Lisensi — kemampuan, tingkatan lisensi, dan memverifikasi apa yang dimuat pada runtime.
- Pemecahan Masalah — watermark, lisensi yang ditolak, dan kesalahan kemampuan.
Apakah halaman ini membantu?