הגדרת רישיון
היכן 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 | חתימה, תחום, חלון גרסה, רשימת שחורות, או שער זמן ריצה של תוסף דחו את הרישיון | קרא את הודעת החריגה/דחייה מבלי לחשוף אותה ללקוחות לא מהימנים |
צעדים הבאים
- רישוי — יכולות, רמות רישיון, ואימות מה נטען בזמן ריצה.
- פתרון בעיות — סימני מים, רישיונות נדחים, ושגיאות יכולת.
האם דף זה היה מועיל?