إعداد الترخيص

المكان الذي يبحث فيه Doconut عن ملف الترخيص الخاص بك

بدون ترخيص، لا يزال Doconut يعرض المستندات — كل صفحة تحمل فقط علامة مائية للتقييم. تغطي هذه الصفحة الطرق الأربع لتوفير ترخيص، والترتيب الدقيق للأولوية عندما يتم تعيين أكثر من واحد.

أربع طرق لتوفير ترخيص

هناك أربع: ثلاثة مصادر صريحة على DoconutOptions — تدفق، محتوى خام، أو مسار ملف — بالإضافة إلى الاكتشاف التلقائي عندما لا يتم تعيين أي منها. عندما يتم تعيين أكثر من واحد، تكون الأولوية دقيقة:

LicenseStream يتفوق على LicenseContent يتفوق على LicensePath يتفوق على البحث التلقائي.

عبر المسار

LicensePath يتم تمريره إلى File.Exists كما هو بالضبط. يتم حل المسار النسبي بالنسبة إلى دليل العمل الحالي للعملية — ليس مجلد مشروعك، ولا المجلد الذي يعيش فيه Program.cs. إذا لم يتم حل المسار، لا يرمي Doconut استثناءً ولا ليس يعود إلى البحث التلقائي — فهو ببساطة لا يحمل أي ترخيص وتظهر العلامة المائية للعارض. يعمل البحث التلقائي فقط عندما لا يكون أي من LicensePath أو LicenseContent أو LicenseStream مُعيّنًا. تُقرأ ملفات الترخيص الخاصة بكل مكوّن إضافي في نفس المجلد (Doconut.Viewer.<Capability>.lic) معها، لذا يعمل LicensePath وAddPlugin<...>() معًا عندما تكون تراخيص الإضافات بجوار الترخيص الأساسي.

يفضل استخدام مسار مطلق (على سبيل المثال مبني من IWebHostEnvironment.WebRootPath أو AppContext.BaseDirectory)، أو تخطي LicensePath تمامًا والاعتماد على الاكتشاف التلقائي أدناه.

csharp
builder.Services.AddDoconut(options =>
{
    options.LicensePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "Doconut.Viewer.lic");
});

عبر التدفق

LicenseStream تُقرأ مرة واحدة عند بدء التشغيل — مفيدة عندما يأتي الترخيص من مخزن سري بدلاً من ملف على القرص.

csharp
// الأولوية: LicenseStream > LicenseContent > LicensePath > البحث التلقائي.
builder.Services.AddDoconut(options =>
{
    options.LicenseStream = licenseStream;
});

عبر المحتوى

LicenseContent تقبل نص الترخيص نفسه — من متغيّر بيئي، قاعدة بيانات، أو مدير أسرار:

csharp
// ملف XML للترخيص من قاعدة بيانات أو متغيّر بيئي أو مدير أسرار —
// لا ملف على القرص. لا يتفوق عليه سوى LicenseStream.
builder.Services.AddDoconut(options =>
{
    options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});

الاكتشاف التلقائي

لا تقم بتكوين أي من المصادر الثلاثة الصريحة، وسيقوم Doconut بالبحث عن الترخيص نفسه:

csharp
// لا تقم بأي تكوين، وسيبحث Doconut عن الترخيص نفسه، في هذين المجلدين فقط:
//   1. {CurrentDirectory}/wwwroot
//   2. {AppContext.BaseDirectory}/wwwroot   (wwwroot داخل مجلد مخرجات البناء)
// يبحث أولاً عن Doconut.lic، ثم Doconut.Viewer.lic، بالإضافة إلى أي مكوّن إضافي
// ملفات Doconut.Viewer.<Capability>.lic بجانبه.
builder.Services.AddDoconut();

مجلدات الفحص، بالترتيب، وأسماء الملفات التي يتم البحث عنها في كل منها:

text
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 license

لا يتم قراءة أي شيء خارج مجلد wwwroot: يتم تجاهل وجود .lic في مجلد الإخراج نفسه، أو في wwwroot/lib.

انسخ الترخيص إلى مجلد الإخراج الخاص بك

عندما لا يتم تشغيل العملية من مجلد المشروع — تطبيق منشور، IIS، حاوية، أو مُشغّل اختبار — يفوت الفحص الأول، ويجب على الفحص الثاني، {AppContext.BaseDirectory}/wwwroot، العثور على الملف. ينسخ تطبيق الاختبار الخاص بـ SDK التراخيص هناك في كل بناء باستخدام هدف MSBuild هذا:

xml
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
  <ItemGroup>
    <DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
    <StaleOutputLicenses Include="$(OutDir)wwwroot\*.lic" />
  </ItemGroup>
  <!-- احذف أولاً، حتى أن إعادة تسمية أو إزالة ملف .lic في wwwroot يزيله أيضاً من المخرجات. -->
  <Delete Files="@(StaleOutputLicenses)" />
  <Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)wwwroot" />
</Target>

يجب أن تكون الوجهة $(OutDir)wwwroot: لا يتم العثور على .lic المنسوخ إلى جذر الإخراج أبدًا بواسطة البحث التلقائي. الأمثلة LicensePath في هذه الصفحة تشير إلى نفس المكان.

احتفظ بملفات .lic خارج التحكم في المصدر — انشرها جنبًا إلى جنب مع التطبيق، أو أدخل الترخيص عبر LicenseContent أو LicenseStream من مخزن الأسرار الخاص بك.

ماذا يحدث بدون ترخيص

عدم وجود ترخيص لا يسبب استثناء. AddDoconut() ينجح، يبدأ التطبيق، ويعمل العارض — لكن كل صفحة تحمل علامة مائية للتقييم ولا تُمنح أي قدرة اختيارية.

ملف الترخيص الذي يُعثر عليه لكنه مرفوض مختلف. توقيع غير صالح، تعديل، إدراج في القائمة السوداء، أو بناء خارج نافذة إصدار الترخيص يسبب أن OpenDocumentAsync يرمي LicenseException مع License.RejectionMessage. ترخيص منتهي صلاحيته حسب التقويم ولا يحتوي على رسالة رفض يواصل العمل في وضع العلامة المائية.

الإضافات تحتاج إلى قدرات

تسجيل إضافة بدون استحقاق مطابق مختلف: بالنسبة لعدم وجود ترخيص، أو ملف TRIAL قديم، أو ترخيص مدفوع بدون تلك القدرة، AddDoconut() يرمي InvalidOperationException، لذا لا يبدأ التطبيق. على سبيل المثال، تسجيل إضافة Converter بدون ترخيص يمنح Converter:

text
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.

الرسالة تخبرك بالإصلاح مباشرة: إما إزالة استدعاء options.AddPlugin<...>() لتلك الإضافة، أو تثبيت ترخيص مدفوع أو ترخيص مؤقت/تجريبي (NFR) نشط يمنح القدرة. يُسمح للتسجيلات المؤقتة بالبقاء بعد تاريخ انتهاء صلاحيتها بحيث يمكن لتطبيق مُعد مسبقًا أن يتدهور أثناء التشغيل بدلاً من التعطل عند إعادة التشغيل؛ بمجرد انتهاء الصلاحية، تُسحب قدراتها.

التحقق من الترخيص المحمَّل

استخدم IDoconutLicenseService، نفس مصدر الحقيقة المستخدم من قبل SDK، لكشف نقطة تشخيص موثقة أو لتوجيه علامات الميزات. لا تُعيد محتويات الترخيص أو المفاتيح.

csharp
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
}));

يُقرأ الترخيص أثناء تسجيل AddDoconut(). ResetLicense هي حاليًا خاصية توافقية بدون مسار إعادة تحميل نشط، لذا استبدال ملف الترخيص يتطلب إعادة تشغيل التطبيق.

مصفوفة استكشاف الأخطاء وإصلاحها

العَرَضالسبب المحتملالتحقق
العارض يعمل لكن كل صفحة تحمل علامة مائيةلم يتم تحميل أي ترخيص، أو الترخيص منتهي صلاحيته حسب التقويمحل IDoconutLicenseService؛ تحقق من دليل الإخراج ودليل عمل العملية
AddDoconut() يرمي لإضافةالترخيص لا يمنح تلك القدرة للإضافةتحقق من IsCapabilityGranted(...) وأزل التسجيلات التي لم تشترها
مسار نسبي مُكوَّن يعمل محليًا لكنه لا يعمل في IIS/حاويةدليل عمل العملية تغيراستخدم AppContext.BaseDirectory أو مسار مطلق
ملف .lic المستبدل لا تأثير لهتم إنشاء خدمة الترخيص المفردة بالفعلأعد تشغيل التطبيق
OpenDocumentAsync يرمي LicenseExceptionالتوقيع، النطاق، نافذة الإصدار، القائمة السوداء، أو بوابة تشغيل الإضافة رفضت الترخيصاقرأ رسالة الاستثناء/الرفض دون كشفها للعملاء غير الموثوق بهم

الخطوات التالية

  • الترخيص — القدرات، مستويات الترخيص، والتحقق مما تم تحميله أثناء التشغيل.
  • استكشاف الأخطاء — العلامات المائية، الترخيص المرفوض، وأخطاء القدرات.

هل كانت هذه الصفحة مفيدة؟