Cấp phép

Các khả năng, cấp độ giấy phép, và dịch vụ giấy phép

Trang này là tài liệu tham chiếu thời gian chạy về cách một giấy phép định hình hành vi của Doconut: những gì mỗi trạng thái giấy phép cho phép, cách các khả năng được cấp, và cách kiểm tra tất cả từ mã nguồn. (Để tải một giấy phép, xem Cài đặt giấy phép.)

Các trạng thái giấy phép và những gì chúng làm

Trạng tháiMở tài liệu?Đánh dấu nướcKhả năng
Giấy phép đầy đủ (trả phí) (trong cửa sổ đăng ký/cập nhật của nó)CóKhôngNhững cái đã mua (Has* flags)
Giấy phép tạm thời (Developer/NFR — giấy phép đánh giá, trước ngày hết hạn)CóKhôngTất cả — cấp toàn bộ (kênh đánh giá)
Đã hết hạn (giấy phép tạm thời đã qua ngày hết hạn, hoặc đăng ký trả phí đã qua ngày gia hạn)CóĐánh dấu nước đánh giáKhông có gì được cấp
Không có tệp giấy phépCóĐánh dấu nước đánh giáKhông có gì được cấp
Đã tìm thấy nhưng bị từ chối (chữ ký không hợp lệ, bị giả mạo, bị liệt kê đen, hoặc bản dựng mới hơn cửa sổ phiên bản của giấy phép)Không — LicenseException trên mỗi lần mở——

Hai hậu quả đáng ghi nhớ:

  • Một giấy phép thiếu không phải là giấy phép tạm thời. Khi không có tệp giấy phép, các trang hiển thị có dấu nước và không có khả năng nào (tìm kiếm, chú thích, plugin) hoạt động. Trải nghiệm đầy đủ tính năng, không có dấu nước yêu cầu một giấy phép tạm thời thực tế (lấy một).
  • Chỉ một giấy phép bị từ chối mới chặn việc mở. Ngày hết hạn lịch/đăng ký chuyển sang hiển thị có dấu nước; nhưng triển khai một bản dựng mới hơn cửa sổ phiên bản của giấy phép sẽ bị từ chối và thất bại nhanh với một LicenseException, vì vậy bạn bắt được nó khi triển khai — không phải bằng cách âm thầm phát hành đầu ra có dấu nước. Ngoại lệ đó (từ OpenDocumentAsync) mang lại lý do từ License.RejectionMessage.

Khả năng

Doconut kiểm soát chức năng tùy chọn bằng capability. Hiện nay chúng là các plugin Converter và DICOM tùy chọn cộng với các tính năng Search và Annotation tích hợp, mỗi tính năng được cấp bởi giấy phép của bạn. Trình xem cơ bản không phải là một capability — nó là điều kiện tiên quyết, được hiển thị dưới dạng IsViewerLicensed:

csharp
bool viewerLicensed = lic.IsViewerLicensed; // Có giấy phép non-TRIAL và bao phủ phiên bản của bản dựng này

Cổng duy nhất mà toàn bộ pipeline sử dụng là IsCapabilityGranted:

csharp
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);

Logic của nó, nguyên văn từ triển khai: một giấy phép tạm thời (không hết hạn) cấp mọi capability — bao gồm cả các capability chưa có cờ mua riêng; một giấy phép mua thực tế cấp đúng các cờ Has* và áp dụng mặc định‑từ chối đối với bất kỳ thứ nào chưa được ánh xạ. (Một tệp loại THỬ NGHIỆM cũ không phải là quyền lợi — nó được xử lý như không có giấy phép: có dấu nước, không có gì được cấp.)

Giấy phép tạm thời

Giấy phép tạm thời (Developer/NFR) được đánh dấu bằng thẻ ExpiryNote và có ngày hết hạn cố định:

Thành viênÝ nghĩa
IsTemporaryThẻ ExpiryNote hiện diện (phát hiện dựa trên sự hiện diện của thẻ — không bao giờ khớp với nội dung ghi chú, nó động)
ExpiryNoteVăn bản thông tin được nhúng trong giấy phép
LicenseExpiryNgày hết hạn cố định (DateTime?)

Ngữ nghĩa hết hạn khác nhau theo cấp độ: một giấy phép tạm thời hết hạn vào chỉ ngày LicenseExpiry (cửa sổ đăng ký của nó bị bỏ qua; một giấy phép tạm thời thiếu ngày sẽ được coi là đã hết hạn, an toàn). Mọi giấy phép khác hết hạn vào ngày cửa sổ đăng ký/cập nhật của nó.

Tham chiếu IDoconutLicenseService

Giải quyết IDoconutLicenseService (namespace Doconut.Core.Interfaces) từ DoconutHost.Services. Nó là một singleton — giấy phép được phân tích một lần, trong DoconutHost.Initialize:

Thành viênÝ nghĩa
LicenseẢnh chụp nhanh đầy đủ DoconutLicenseInfo (bên dưới)
IsTrialTệp loại THỬ NGHIỆM cũ (được xử lý như không có giấy phép — không phải là quyền lợi)
IsTemporary / ExpiryNote / LicenseExpiryDấu hiệu giấy phép tạm thời
IsExpiredĐã hết hạn theo quy tắc cấp độ ở trên
IsVersionValidBản dựng này nằm trong cửa sổ hỗ trợ của giấy phép
IsViewerLicensedTệp không phải TRIAL được tìm thấy và phiên bản được bao phủ — điều kiện tiên quyết cơ bản
IsCapabilityGranted(cap)Cổng khả năng duy nhất
HasSearch HasAnnotation HasConverter HasDicomCác cờ mua theo capability được phát hành — sử dụng IsCapabilityGranted cho câu trả lời nhận thức tạm thời
IsValidForDomain(host)Phạm vi host; giấy phép V4 sử dụng ký tự đại diện *.*
LicenseRejectionReasonKhông rỗng ⇒ việc mở bị chặn với thông báo này

DoconutLicenseInfo hiển thị ảnh chụp nhanh thân thiện với giao diện cho các bảng điều khiển quản trị: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, các cờ Has*, các trường giấy phép tạm thời, và RejectionMessage.

csharp
// GET /Features - feature-flag UI của bạn từ cùng nguồn dữ liệu thực tế mà SDK sử dụng
public ActionResult Index()
{
    var lic = Doconut.DoconutHost.Services.GetRequiredService<IDoconutLicenseService>();

    return Json(new
    {
        viewer     = lic.IsViewerLicensed || lic.IsTemporary,
        search     = lic.IsCapabilityGranted(LicenseCapability.Search),
        annotation = lic.IsCapabilityGranted(LicenseCapability.Annotation),
        conversion = lic.HasConverter,
        dicom      = lic.HasDicom,
    }, JsonRequestBehavior.AllowGet);
}

Kiểm tra sức khỏe

Doconut đăng ký một kiểm tra sức khỏe "doconut" báo cáo trạng thái giấy phép. Classic ASP.NET không có endpoint sức khỏe riêng, vì vậy hãy mở nó từ một controller:

csharp
// GET /Health - Doconut đăng ký một kiểm tra sức khỏe "doconut" báo cáo trạng thái giấy phép:
// Khỏe (hợp lệ), Giảm (trial hoặc không có tệp giấy phép), Không khỏe (đã hết hạn).
public async Task<ActionResult> Index()
{
    var health = Doconut.DoconutHost.Services.GetRequiredService<HealthCheckService>();
    HealthReport report = await health.CheckHealthAsync();

    Response.StatusCode = report.Status == HealthStatus.Unhealthy ? 503 : 200;
    return Content(report.Status.ToString(), "text/plain");
}

Kết nối nó vào hệ thống giám sát của bạn và một đăng ký sắp hết hạn sẽ trở thành một cảnh báo thay vì một phiếu hỗ trợ. Xem DoconutHost để biết các giá trị trạng thái.

Nâng cấp phiên bản

Một giấy phép bao phủ một cửa sổ phiên bản. Cập nhật gói NuGet lên một bản dựng mới hơn cửa sổ đó làm cho giấy phép không hợp lệ cho bản dựng này: IsVersionValid chuyển thành false và việc mở bị chặn với một LicenseException (lý do nằm trong License.RejectionMessage) — cố ý fail‑fast, vì vậy một bản dựng cũ hoặc không có giấy phép sẽ bị bắt tại thời điểm triển khai thay vì âm thầm đánh dấu nước đầu ra sản xuất. Gia hạn đăng ký, thay thế .lic trong wwwroot, và tái khởi động pool ứng dụng để DoconutHost.Initialize tải giấy phép mới.

Trang này có hữu ích không?