راهاندازی مجوز
محل جستجوی 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 را نادیده بگیرید و به کشف خودکار زیر تکیه کنید.
builder.Services.AddDoconut(options =>
{
options.LicensePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "Doconut.Viewer.lic");
});بر اساس جریان
LicenseStream یکبار در زمان راهاندازی خوانده میشود — مفید زمانی که مجوز از یک مخزن مخفی بهجای یک فایل روی دیسک میآید.
// اولویت: LicenseStream > LicenseContent > LicensePath > auto-search.
builder.Services.AddDoconut(options =>
{
options.LicenseStream = licenseStream;
});بر اساس محتوا
LicenseContent متن خود مجوز را میپذیرد — از یک متغیر محیطی، یک پایگاه داده، یا یک مدیر مخفی:
// XML مجوز از پایگاه داده، متغیر محیطی یا مدیر راز —
// فایلی روی دیسک وجود ندارد. فقط توسط LicenseStream پیشی گرفته میشود.
builder.Services.AddDoconut(options =>
{
options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});کشف خودکار
هیچیک از سه منبع صریح را پیکربندی نکنید، و Doconut خود بهدنبال مجوز میگردد:
// هیچچیزی پیکربندی نشود، و Doconut خود بهدنبال مجوز میگردد، فقط در این دو پوشه:
// 1. {CurrentDirectory}/wwwroot
// 2. {AppContext.BaseDirectory}/wwwroot (wwwroot داخل پوشه خروجی ساخت)
// ابتدا به دنبال Doconut.lic میگردد، سپس Doconut.Viewer.lic، بهعلاوه هر پلاگینخاص
// فایلهای Doconut.Viewer.<Capability>.lic در کنار آن.
builder.Services.AddDoconut();پوشههای بررسی، به ترتیب، و نامهای فایلهایی که در هر کدام جستجو میشوند:
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 مجوزها را به آنجا کپی میکند:
<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 را اعطا کند:
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 استفاده میشود، برای افشای یک نقطهٔ پایانی تشخیص احراز هویت شده یا برای کنترل پرچمهای ویژگی. محتویات یا کلیدهای مجوز را برنگردانید.
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 را پرتاب میکند | امضا، دامنه، بازهٔ نسخه، فهرست سیاه، یا دروازهٔ زمان اجرا افزونه مجوز را رد کردهاند | پیام استثنا/رد را بخوانید بدون اینکه به مشتریان غیرقابل اعتماد نشان داده شود |
گامهای بعدی
آیا این صفحه مفید بود؟