הגדרת רישיון
Where Doconut looks for your license file
ללא רישיון, Doconut עדיין מציג מסמכים — כל דף מציג סימן מים של הערכה. דף זה מסביר את ארבעת הדרכים לספק רישיון, ואת סדר העדיפויות המדויק כאשר מוגדרים יותר מאחד.
ארבע דרכים לספק רישיון
קיימות ארבע דרכים: שלושה מקורות מפורשים ב‑DoconutOptions — זרם, תוכן גולמי, או נתיב קובץ — ועוד גילוי אוטומטי כאשר אף אחד מהם לא מוגדר. כאשר מוגדרים יותר מאחד, סדר העדיפויות הוא מדויק:
LicenseStream beats LicenseContent beats LicensePath beats auto-search.
לפי נתיב
LicensePath מועבר ל‑File.Exists בדיוק כפי שניתן. נתיב יחסי נפתר יחסית ל‑current working directory של התהליך — לא לתיקיית הפרויקט שלך, ולא לתיקייה שבה נמצא 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, ועוד כל קובץ per-plugin
// 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>
<!-- Delete first, so renaming or removing a .lic in wwwroot also takes it out of the output. -->
<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 | חתימה, תחום, חלון גרסה, רשימה שחורה, או שער זמן ריצה של תוסף דחו את הרישיון | קרא את הודעת החריגה/דחייה מבלי לחשוף אותה ללקוחות לא מהימנים |
הצעדים הבאים
- רישוי — יכולות, רמות רישיון, ואימות מה נטען בזמן ריצה.
- פתרון בעיות — סימני מים, רישיונות נדחים, ושגיאות יכולת.
האם דף זה היה מועיל?