Cài đặt Giấy phép
Nơi Doconut tìm kiếm tệp giấy phép của bạn
Nếu không có giấy phép, Doconut vẫn hiển thị tài liệu — mỗi trang chỉ có một dấu nước đánh giá. Trang này trình bày bốn cách cung cấp giấy phép, và thứ tự ưu tiên chính xác khi có hơn một cách được thiết lập.
Bốn cách cung cấp giấy phép
Có bốn cách: ba nguồn rõ ràng trên DoconutOptions — một luồng, nội dung thô, hoặc một đường dẫn tệp — cộng với việc tự động khám phá khi không có nào được thiết lập. Khi có hơn một nguồn được thiết lập, thứ tự ưu tiên là như sau:
LicenseStream thắng LicenseContent thắng LicensePath thắng auto-search.
Theo đường dẫn
LicensePath được truyền vào File.Exists chính xác như đã cho. Một đường dẫn tương đối được giải quyết dựa trên thư mục làm việc hiện tại của tiến trình — không phải thư mục dự án của bạn, và không phải thư mục chứa Program.cs. Nếu đường dẫn không được giải quyết, Doconut không ném lỗi và không quay lại auto-search — nó chỉ đơn giản không tải giấy phép và trình xem sẽ có dấu nước. Auto-search chỉ chạy khi không có LicensePath, LicenseContent, hoặc LicenseStream nào được thiết lập. Các tệp giấy phép theo plugin trong cùng thư mục (Doconut.Viewer.<Capability>.lic) được đọc cùng với nó, vì vậy LicensePath và AddPlugin<...>() hoạt động cùng nhau khi các giấy phép plugin nằm bên cạnh giấy phép cơ bản.
Nên ưu tiên sử dụng đường dẫn tuyệt đối (ví dụ được xây dựng từ IWebHostEnvironment.WebRootPath hoặc AppContext.BaseDirectory), hoặc bỏ qua hoàn toàn LicensePath và dựa vào việc tự động khám phá bên dưới.
builder.Services.AddDoconut(options =>
{
options.LicensePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "Doconut.Viewer.lic");
});Theo luồng
LicenseStream được đọc một lần khi khởi động — hữu ích khi giấy phép đến từ một kho bí mật thay vì một tệp trên đĩa.
// Thứ tự ưu tiên: LicenseStream > LicenseContent > LicensePath > auto-search.
builder.Services.AddDoconut(options =>
{
options.LicenseStream = licenseStream;
});Theo nội dung
LicenseContent nhận trực tiếp văn bản giấy phép — từ biến môi trường, cơ sở dữ liệu, hoặc trình quản lý bí mật:
// XML giấy phép từ cơ sở dữ liệu, biến môi trường, hoặc trình quản lý bí mật —
// không có tệp trên đĩa. Chỉ bị LicenseStream vượt qua.
builder.Services.AddDoconut(options =>
{
options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});Tự động khám phá
Không cấu hình bất kỳ ba nguồn rõ ràng nào, và Doconut sẽ tự tìm kiếm giấy phép:
// Không cấu hình gì, và Doconut tìm kiếm giấy phép tự động, chỉ trong hai thư mục này:
// 1. {CurrentDirectory}/wwwroot
// 2. {AppContext.BaseDirectory}/wwwroot (wwwroot trong thư mục đầu ra của build)
// Nó tìm Doconut.lic trước, sau đó Doconut.Viewer.lic, cộng với bất kỳ
// các tệp Doconut.Viewer.<Capability>.lic nằm bên cạnh nó.
builder.Services.AddDoconut();Các thư mục kiểm tra, theo thứ tự, và các tên tệp được tìm trong mỗi thư mục:
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 licenseKhông có gì bên ngoài thư mục wwwroot được đọc: một tệp .lic trong thư mục đầu ra, hoặc trong wwwroot/lib, sẽ bị bỏ qua.
Sao chép giấy phép vào thư mục đầu ra của bạn
Khi tiến trình không chạy từ thư mục dự án — một ứng dụng đã xuất bản, IIS, một container, một trình chạy thử nghiệm — lần kiểm tra đầu tiên sẽ không tìm thấy, và lần thứ hai, {AppContext.BaseDirectory}/wwwroot, phải tìm tệp. Ứng dụng thử nghiệm của SDK tự sao chép các giấy phép vào đó trong mỗi lần build bằng mục tiêu MSBuild này:
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
<ItemGroup>
<DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
<StaleOutputLicenses Include="$(OutDir)wwwroot\*.lic" />
</ItemGroup>
<!-- Delete first, so renaming or removing a .lic in wwwroot also takes it out of the output. -->
<Delete Files="@(StaleOutputLicenses)" />
<Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)wwwroot" />
</Target>Đích phải là $(OutDir)wwwroot: một tệp .lic được sao chép vào gốc đầu ra sẽ không bao giờ được auto-search tìm thấy. Các ví dụ LicensePath trên trang này chỉ tới cùng một vị trí.
Giữ các tệp
.licra khỏi hệ thống kiểm soát nguồn — triển khai chúng bên cạnh ứng dụng, hoặc chèn giấy phép quaLicenseContenthoặcLicenseStreamtừ kho bí mật của bạn.
Điều gì xảy ra khi không có giấy phép
Một giấy phép thiếu không gây ra lỗi. AddDoconut() thành công, ứng dụng khởi động, và trình xem chạy — nhưng mỗi trang đều có dấu nước đánh giá và không có khả năng tùy chọn nào được cấp.
Một tệp giấy phép được tìm thấy nhưng bị từ chối thì khác. Chữ ký không hợp lệ, bị giả mạo, bị đưa vào danh sách đen, hoặc bản dựng nằm ngoài khoảng thời gian phiên bản của giấy phép sẽ khiến OpenDocumentAsync ném LicenseException kèm License.RejectionMessage. Một giấy phép hết hạn theo lịch mà không có thông báo từ chối sẽ tiếp tục ở chế độ có dấu nước.
Plugin cần khả năng
Đăng ký một plugin mà không có quyền tương ứng là khác: đối với giấy phép thiếu, tệp TRIAL cũ, hoặc giấy phép trả phí mà không có khả năng đó, AddDoconut() ném InvalidOperationException, vì vậy ứng dụng không khởi động. Ví dụ, đăng ký plugin Converter mà không có giấy phép cấp 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.Thông báo này cho bạn cách khắc phục trực tiếp: hoặc loại bỏ lời gọi options.AddPlugin<...>() cho plugin đó, hoặc cài đặt một giấy phép trả phí hoặc một giấy phép Temporary/Demo (NFR) đang hoạt động mà cấp khả năng đó. Các đăng ký tạm thời được cho phép tồn tại sau ngày hết hạn để một ứng dụng đã cấu hình có thể giảm chức năng ở thời gian chạy thay vì bị sập khi khởi động lại; một khi hết hạn, các khả năng của chúng vẫn bị thu hồi.
Xác minh giấy phép đã tải
Sử dụng IDoconutLicenseService, nguồn dữ liệu duy nhất giống như SDK, để cung cấp một endpoint chẩn đoán đã xác thực hoặc để điều khiển các tính năng. Không trả về nội dung hoặc khóa của giấy phép.
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
}));Giấy phép được đọc trong quá trình đăng ký AddDoconut(). ResetLicense hiện là một thuộc tính tương thích mà không có đường tải lại hoạt động, vì vậy việc thay thế tệp giấy phép yêu cầu khởi động lại ứng dụng.
Ma trận khắc phục sự cố
| Triệu chứng | Nguyên nhân khả dĩ | Kiểm tra |
|---|---|---|
| Trình xem hoạt động nhưng mỗi trang đều có dấu nước | Không có giấy phép nào được tải, hoặc giấy phép đã hết hạn theo lịch | Giải quyết IDoconutLicenseService; kiểm tra thư mục đầu ra và thư mục làm việc của tiến trình |
AddDoconut() ném lỗi cho một plugin | Giấy phép không cấp khả năng cho plugin đó | Kiểm tra IsCapabilityGranted(...) và loại bỏ các đăng ký bạn không mua |
| Đường dẫn tương đối đã cấu hình hoạt động cục bộ nhưng không hoạt động trong IIS/container | Thư mục làm việc của tiến trình đã thay đổi | Sử dụng AppContext.BaseDirectory hoặc một đường dẫn tuyệt đối |
Tệp .lic đã thay thế không có hiệu lực | Dịch vụ giấy phép singleton đã được tạo | Khởi động lại ứng dụng |
OpenDocumentAsync ném LicenseException | Chữ ký, miền, khoảng thời gian phiên bản, danh sách đen, hoặc cổng thời gian chạy của plugin đã từ chối giấy phép | Đọc thông báo ngoại lệ/từ chối mà không tiết lộ cho khách hàng không tin cậy |
Các bước tiếp theo
- Cấp phép — các tính năng, các cấp giấy phép và việc xác minh những gì đã được tải tại thời gian chạy.
- Khắc phục sự cố — dấu nước, giấy phép bị từ chối và lỗi về khả năng.
Trang này có hữu ích không?