הגדרת רישיון
היכן Doconut מחפש את קובץ הרישיון שלך
בלי רישיון, Doconut עדיין מציג מסמכים — כל עמוד מציג סימן מים של הערכה. דף זה מסביר את ארבעת הדרכים לספק רישיון, ואת סדר העדיפות המדויק כאשר מוגדרים יותר מאחד.
ארבע דרכים לספק רישיון
קיימות ארבע דרכים: שלושה מקורות מפורשים ב‑DoconutOptions — זרם, תוכן גולמי, או נתיב קובץ — בנוסף לגילוי אוטומטי כאשר אף אחד מהם לא מוגדר. כאשר מוגדרים יותר מאחד, סדר העדיפות הוא מדויק:
LicenseStream גובר על LicenseContent גובר על LicensePath גובר על חיפוש אוטומטי.
לפי נתיב
LicensePath מועבר ל‑File.Exists בדיוק כפי שניתן. נתיב יחסי נפתר יחסית ל‑ספריית העבודה הנוכחית של התהליך — לא לתיקיית הפרויקט שלך, ולא לתיקייה שבה נמצא Program.cs. אם הנתיב אינו נפתר, Doconut לא זורק חריגה ולא נופל לחיפוש אוטומטי — הוא פשוט לא טוען רישיון והצופה מציג סימן מים. חיפוש אוטומטי פועל רק כאשר אף אחד מ‑LicensePath, LicenseContent, או LicenseStream אינו מוגדר.
העדף נתיב מוחלט (למשל שנבנה מ‑IWebHostEnvironment.WebRootPath או AppContext.BaseDirectory), או דלג על LicensePath לחלוטין והסתמך על הגילוי האוטומטי למטה.
builder.Services.AddDoconut(options =>
{
options.LicensePath = Path.Combine(AppContext.BaseDirectory, "Doconut.Viewer.lic");
});לפי זרם
LicenseStream נקרא פעם אחת בזמן האתחול — שימושי כאשר הרישיון מגיע מאחסון סודי במקום מקובץ על הדיסק.
// Precedence: LicenseStream > LicenseContent > LicensePath > auto-search.
builder.Services.AddDoconut(options =>
{
options.LicenseStream = licenseStream;
});לפי תוכן
LicenseContent מקבל את טקסט הרישיון עצמו — ממשתנה סביבתי, ממסד נתונים, או ממנהל סודות:
// License XML from a database, environment variable, or secret manager —
// no file on disk. Beaten only by LicenseStream.
builder.Services.AddDoconut(options =>
{
options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});גילוי אוטומטי
הגדר שלא תשתמש באף אחד משלושת המקורות המפורשים, ו‑Doconut יחפש את הרישיון בעצמו:
// Configure nothing, and Doconut searches for the license itself:
// 1. {CurrentDirectory}/wwwroot
// 2. {CurrentDirectory}/wwwroot/lib
// 3. AppContext.BaseDirectory (the build output folder)
// It looks for Doconut.Viewer.lic plus any per-plugin
// Doconut.Viewer.<Capability>.lic files alongside it.
builder.Services.AddDoconut();ספריות הסריקה, לפי סדר, ושמות הקבצים שנבדקים בכל אחת מהן:
1. {CurrentDirectory}/wwwroot
2. {CurrentDirectory}/wwwroot/lib
3. AppContext.BaseDirectory
Filenames (checked in each directory above, in order):
Doconut.Viewer.lic — base viewer license
Doconut.Viewer.<Capability>.lic — per-plugin license, alongside Doconut.Viewer.licהעתק את הרישיון לתיקיית הפלט שלך
LicensePath, והסריקה האוטומטית של AppContext.BaseDirectory, שניהם דורשים שהקובץ .lic יהיה קיים ליד האפליקציה שנבנתה — לא רק בתיקיית wwwroot המקורית שלך. אפליקציית הבדיקה של ה‑SDK מעתיקה אותו בכל בנייה באמצעות יעד MSBuild זה:
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
<ItemGroup>
<DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
</ItemGroup>
<Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
</Target>שמור קבצי
.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 | חתימה, תחום, חלון גרסה, רשימת שחורות, או שער זמן ריצה של תוסף דחו את הרישיון | קרא את הודעת החריגה/דחייה מבלי לחשוף אותה ללקוחות לא מהימנים |
צעדים הבאים
- רישוי — יכולות, רמות רישיון, ואימות מה נטען בזמן ריצה.
- פתרון בעיות — סימני מים, רישיונות שנדחו, ושגיאות יכולת.
האם דף זה היה מועיל?