مجوزدهی
قابلیتها، سطوح مجوز و سرویس مجوز
این صفحه مرجع زمان اجرا برای نحوهٔ شکلگیری رفتار Doconut توسط یک مجوز است: هر وضعیت مجوز چه چیزی را اجازه میدهد، چگونه قابلیتها اعطا میشوند و چگونه میتوانید همهٔ اینها را از کد بررسی کنید. (برای بارگذاری یک مجوز، به تنظیم مجوز مراجعه کنید.)
وضعیتهای مجوز و عملکرد آنها
| وضعیت | سندها را باز میکند؟ | علامتآب | قابلیتها |
|---|---|---|---|
| مجوز کامل (پرداختشده) (درون بازهٔ اشتراک/بهروزرسانی آن) | بله | هیچکدام | آنهایی که خریداری شدهاند (Has* پرچمها) |
| مجوز موقت (توسعهدهنده/NFR — مجوز ارزیابی، پیش از تاریخ انقضا) | بله | هیچکدام | همه — اعطای کلی (کانال ارزیابی) |
| منقضیشده (مجوز موقت پس از تاریخ انقضا، یا اشتراک پرداختشده پس از تاریخ تجدید) | بله | علامتآب ارزیابی | هیچکدام اعطا نشده |
| هیچ فایل مجوزی وجود ندارد | بله | علامتآب ارزیابی | هیچکدام اعطا نشده |
| یافت شد اما رد شد (امضای نامعتبر، دستکاریشده، فهرستسیاه، یا ساختی جدیدتر از بازهٔ نسخهٔ مجوز) | خیر — LicenseException در هر باز کردن | — | — |
دو پیامد که باید در ذهن داشته باشید:
- یک مجوز گمشده، مجوز موقت نیست. در صورت عدم وجود فایل مجوز، صفحات با علامتآب نمایش داده میشوند و هیچ قابلیتی (جستجو، حاشیهنویسی، افزونهها) فعال نیست. تجربهٔ کامل بدون علامتآب نیاز به یک مجوز موقت واقعی دارد (دریافت یک مجوز).
- فقط یک مجوز رد شده باز کردن را مسدود میکند. انقضای تقویم/اشتراک به رندر علامتآبی منجر میشود؛ اما استقرار یک ساخت جدیدتر از بازهٔ نسخهٔ مجوز رد میشود و بهسرعت شکست میخورد با
LicenseException، بنابراین شما آن را در زمان استقرار میگیرید — نه با ارسال بیصدا خروجی علامتآبدار. این استثنا (ازOpenDocumentAsync) دلیل را ازLicense.RejectionMessageحمل میکند.
قابلیتها
Doconut قابلیتهای اختیاری را با قابلیت محدود میکند. امروز اینها افزونههای Converter و DICOM بهصورت انتخابی بههمراه ویژگیهای داخلی Search و Annotation هستند که هر کدام توسط مجوز شما اعطا میشوند. نمایشگر پایه یک قابلیت نیست — پیشنیاز است که به صورت IsViewerLicensed ظاهر میشود:
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's versionدروازهٔ تکقابلیتی که تمام خط لوله از آن استفاده میکند IsCapabilityGranted است:
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);منطق آن، همانطور که در پیادهسازی آمده است: یک مجوز موقت فعال (غیرمنقضی) تمام قابلیتها را اعطا میکند — حتی قابلیتهایی که هنوز پرچم خرید اختصاصی ندارند؛ یک مجوز خریداریشده واقعی دقیقاً پرچمهای Has* خود را اعطا میکند و برای هر چیزی که نگاشت نشده باشد بهصورت پیشفرض رد میشود. (یک فایل نوع TRIAL قدیمی حقالامتیاز نیست — به عنوان بدون مجوز در نظر گرفته میشود: علامتآبدار، هیچچیزی اعطا نمیشود.)
مجوزهای موقت
مجوزهای موقت (توسعهدهنده/NFR) با یک برچسب ExpiryNote علامتگذاری میشوند و تاریخ انقضای سختی دارند:
| عضو | معنی |
|---|---|
IsTemporary | یک برچسب ExpiryNote موجود است (تشخیص بر اساس وجود برچسب — متن برچسب هرگز مطابقت داده نمیشود، پویا است) |
ExpiryNote | متن اطلاعاتی تعبیهشده در مجوز |
LicenseExpiry | تاریخ انقضای سخت (DateTime?) |
معنای انقضا بر حسب سطح متفاوت است: یک مجوز موقت فقط در تاریخ LicenseExpiry منقضی میشود (پنجرهٔ اشتراک آن نادیده گرفته میشود؛ یک مجوز موقت بدون تاریخ به عنوان منقضی، بهصورت ایمن رفتار میکند). تمام سایر مجوزها در تاریخ پنجرهٔ اشتراک/بهروزرسانی منقضی میشوند.
مرجع IDoconutLicenseService
IDoconutLicenseService (فضاینام Doconut.Core.Interfaces) را از DoconutHost.Services حل کنید. این سرویس یک تکنمونه است — مجوز یک بار در DoconutHost.Initialize تجزیه میشود:
| عضو | معنی |
|---|---|
License | تصویر کامل DoconutLicenseInfo (در زیر) |
IsTrial | فایل نوع TRIAL قدیمی (به عنوان بدون مجوز در نظر گرفته میشود — نه یک حقالامتیاز) |
IsTemporary / ExpiryNote / LicenseExpiry | نشانگرهای مجوز موقت |
IsExpired | منقضیشده بر اساس قوانین سطوح بالا |
IsVersionValid | این ساخت در بازهٔ پشتیبانی مجوز قرار دارد |
IsViewerLicensed | فایل غیر TRIAL یافت شد و نسخه پوشش داده شده — پیشنیاز پایه |
IsCapabilityGranted(cap) | دروازهٔ تکقابلیت |
HasSearch HasAnnotation HasConverter HasDicom | پرچمهای خرید هر قابلیت منتشر شده — برای پاسخ آگاه به موقت از IsCapabilityGranted استفاده کنید |
IsValidForDomain(host) | پوشش میزبان؛ مجوزهای V4 از کاراکترهای جایگزین *.* استفاده میکنند |
LicenseRejectionReason | غیر خالی ⇒ باز کردن با این پیام مسدود میشود |
DoconutLicenseInfo تصویر کاربرپسند برای پنلهای مدیریت را نشان میدهد: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, پرچمهای Has*, فیلدهای مجوز موقت، و RejectionMessage.
// GET /Features - feature-flag your UI from the same source of truth the SDK uses
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);
}بررسی سلامت
Doconut یک بررسی سلامت "doconut" ثبت میکند که وضعیت مجوز را گزارش میدهد. ASP.NET کلاسیک نقطهٔ پایانی سلامت خود را ندارد، بنابراین آن را از یک کنترلر در دسترس بگذارید:
// GET /Health - Doconut registers a "doconut" health check that reports the license state:
// Healthy (valid), Degraded (trial or no license file), Unhealthy (expired).
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");
}آن را به سیستم مانیتورینگ خود متصل کنید تا یک اشتراک منقضیشده به جای یک تیکت پشتیبانی، یک هشدار شود. برای مقادیر وضعیت به DoconutHost مراجعه کنید.
بهروزرسانی نسخهها
یک مجوز یک پنجرهٔ نسخه را پوشش میدهد. بهروزرسانی بسته NuGet به یک ساخت جدیدتر از آن پنجره، مجوز را برای این ساخت نامعتبر میکند: IsVersionValid به false تبدیل میشود و باز کردن مسدود میشود با LicenseException (دلیل در License.RejectionMessage است) — بهصورت عمدی برای شکست سریع، تا یک ساخت منسوخ یا بدون مجوز در زمان استقرار شناسایی شود نه اینکه بهصورت بیصدا خروجی تولیدی را علامتآبدار کند. اشتراک را تمدید کنید، فایل .lic در wwwroot را جایگزین کنید و استخر برنامه را بازچرخانی کنید تا DoconutHost.Initialize مجوز جدید را بارگذاری کند.
آیا این صفحه مفید بود؟