الترخيص
القدرات، مستويات الترخيص، وخدمة الترخيص
هذه الصفحة هي مرجع وقت التشغيل لكيفية تشكيل الترخيص لسلوك Doconut: ما يسمح به كل حالة ترخيص، كيف تُمنح القدرات، وكيفية فحص كل ذلك من الشيفرة. (لـ تحميل ترخيص، راجع البدء → إعداد الترخيص.)
حالات الترخيص وما تقوم به
| الحالة | يفتح المستندات؟ | علامة مائية | القدرات |
|---|---|---|---|
| رخصة كاملة (مدفوعة) (ضمن نافذة الاشتراك/التحديث الخاصة بها) | نعم | لا شيء | التي تم شراؤها (Has* flags) |
| رخصة مؤقتة (المطور/غير تجاري — رخصة التقييم، قبل تاريخ انتهاء صلاحيتها) | نعم | لا شيء | الكل — منح شامل (قمع التقييم) |
| منتهي (رخصة مؤقتة بعد تاريخ انتهاء صلاحيتها، أو اشتراك مدفوع بعد تاريخ تجديده) | نعم | علامة مائية للتقييم | لم يتم منح أي شيء |
| لا يوجد ملف ترخيص على الإطلاق | نعم | علامة مائية للتقييم | لم يتم منح أي شيء |
| تم العثور عليه لكنه مرفوض (توقيع غير صالح، تم العبث به، مدرج في القائمة السوداء، أو بناء أحدث من نافذة إصدار الترخيص) | لا — 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 من النوع القديم ليس استحقاقًا — يُعامل كغير مرخص: علامة مائية، لا شيء ممنوح.)
تراخيص مؤقتة
يستخدم البحث العادي والتعليق قدراتهما الحالية مباشرةً.
يُشار إلى تراخيص مؤقتة (المطور/غير تجاري) بواسطة علامة ExpiryNote وتحمل تاريخ انتهاء صلب:
| العضو | المعنى |
|---|---|
IsTemporary | وجود علامة ExpiryNote (الكشف يتم بوجود العلامة — لا يتم مطابقة نص الملاحظة، فهي ديناميكية) |
ExpiryNote | نص معلوماتي مدمج في الترخيص |
LicenseExpiry | تاريخ الانتهاء الصلب (DateTime?) |
تختلف دلالات الانتهاء حسب المستوى: تنتهي الرخصة المؤقتة في تاريخ LicenseExpiry فقط (يتم تجاهل نافذة الاشتراك الخاصة بها؛ الرخصة المؤقتة التي تفتقد التاريخ تُعامل كمنتهية، كإجراء أمان). كل رخصة أخرى تنتهي في تاريخ نافذة الاشتراك/التحديث الخاصة بها.
مرجع IDoconutLicenseService
حقن IDoconutLicenseService (المساحة Doconut.Core.Interfaces; مسجلة ككائن واحد — يتم تحليل الترخيص مرة واحدة عند بدء التشغيل):
| العضو | المعنى |
|---|---|
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.
// Feature-flag your UI from the same source of truth the SDK uses
app.MapGet("/api/features", (IDoconutLicenseService lic) => Results.Ok(new
{
viewer = lic.IsViewerLicensed || lic.IsTemporary,
search = lic.IsCapabilityGranted(LicenseCapability.Search),
annotation = lic.IsCapabilityGranted(LicenseCapability.Annotation),
conversion = lic.HasConverter,
dicom = lic.HasDicom,
}));فحص الصحة
AddDoconut() تسجل فحص صحة "doconut" الذي يبلغ عن حالة الترخيص/الانتهاء عبر آلية ASP.NET Core القياسية:
app.MapHealthChecks("/health");اربطه بمراقبتك وستصبح الاشتراكات القريبة من الانتهاء تنبهًا بدلاً من تذكرة دعم.
ترقيات الإصدار
يغطي الترخيص نافذة إصدار. تحديث حزمة NuGet إلى بناء أحدث من تلك النافذة يجعل الترخيص غير صالح لهذا البناء: يتحول IsVersionValid إلى false ويتم حظر الفتح مع LicenseException (السبب في License.RejectionMessage) — فشل سريع متعمد، بحيث يتم اكتشاف بناء قديم أو غير مرخص عند النشر بدلاً من وضع علامة مائية صامتة على مخرجات الإنتاج. جدد الاشتراك، استبدل ملف .lic، وأعد تشغيل التطبيق حتى يقوم AddDoconut() بتحميل الترخيص الجديد.
هل كانت هذه الصفحة مفيدة؟