الترخيص
القدرات، مستويات الترخيص، وخدمة الترخيص
هذه الصفحة هي مرجع وقت التشغيل لكيفية تشكيل الترخيص لسلوك Doconut: ما تسمح به كل حالة ترخيص، كيف تُمنح القدرات، وكيفية فحص كل ذلك من الشيفرة. (لـ تحميل ترخيص، راجع إعداد الرخصة.)
حالات الترخيص وما تفعله
| الحالة | يفتح المستندات؟ | العلامة المائية | القدرات |
|---|---|---|---|
| رخصة كاملة (مدفوعة) (ضمن نافذة الاشتراك/التحديث الخاصة بها) | نعم | لا شيء | التي تم شراؤها (Has* flags) |
| رخصة مؤقتة (المطور/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، وأعد تدوير مجموعة تطبيقات الـ IIS حتى يحمل DoconutHost.Initialize الرخصة الجديدة.
هل كانت هذه الصفحة مفيدة؟