הגדרת רישיון
היכן Doconut מחפש את קובץ הרישיון שלך תחת IIS
ללא רישיון, Doconut עדיין מציג מסמכים — כל דף מציג סימן מים של הערכה. דף זה מסביר את ארבעת הדרכים לספק רישיון ב‑Global.asax, היכן Doconut מחפש כאשר לא מסופק רישיון, ומה קורה כאשר רישיון של תוסף חסר.
ארבע דרכים לספק רישיון
יש שלושה מקורות מפורשים ב‑DoconutOptions — נתיב קובץ, זרם, או תוכן גולמי — בנוסף לגילוי אוטומטי כאשר אף אחד מהם אינו מוגדר. כולם נקראים פעם אחת, ב‑DoconutHost.Initialize. כאשר מוגדרים יותר מאחד, סדר העדיפות הוא מדויק:
LicenseStream גובר על LicenseContent גובר על LicensePath גובר על גילוי אוטומטי.
לפי נתיב
ספק ל‑LicensePath נתיב מלא. נתיב יחסי נפתר ביחס לתיקייה הנוכחית של התהליך, וב‑IIS זו תיקיית תהליך העובד עצמו, ולא של האתר שלך. HostingEnvironment.MapPath ממיר נתיב יחסי של האתר לנתיב מלא:
Doconut.DoconutHost.Initialize(options =>
{
options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
});אם הקובץ אינו קיים, Doconut לא זורק חריגה ולא חוזר לגילוי אוטומטי: הוא לא טוען רישיון, והצופה מציג סימן מים. קבצי הרישיון של תוספים באותה תיקייה (Doconut.Viewer.<Capability>.lic) נקראים יחד איתו, ולכן LicensePath ו‑AddPlugin<...>() פועלים יחד כאשר רישיונות התוספים נמצאים לצד רישיון הבסיס.
לפי זרם
LicenseStream נקרא פעם אחת, בזמן האתחול — שימושי כאשר הרישיון מגיע ממשאב משובץ או מחנות סודית במקום קובץ על הדיסק.
// Precedence: LicenseStream > LicenseContent > LicensePath > auto-search.
Doconut.DoconutHost.Initialize(options =>
{
options.LicenseStream = licenseStream;
});לפי תוכן
LicenseContent מקבל את טקסט הרישיון עצמו — ממשתנה סביבתי, ממסד נתונים, או מחנות סודית — ולכן אין צורך לפרוס קובץ רישיון עם האתר.
// License XML from a database, an environment variable or a secret store -
// no file on disk. Beaten only by LicenseStream.
Doconut.DoconutHost.Initialize(options =>
{
options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});גילוי אוטומטי
אל תגדיר אף אחד משלושת האפשרויות, ו‑Doconut יחפש את הרישיון בעצמו:
// Configure nothing, and Doconut searches for the license itself, in this order:
// 1. {CurrentDirectory}\wwwroot
// 2. {AppContext.BaseDirectory}\wwwroot (under IIS: the site's root folder)
// It looks for Doconut.lic first, then Doconut.Viewer.lic, plus any per-plugin
// Doconut.Viewer.<Capability>.lic files alongside it.
Doconut.DoconutHost.Initialize();השתי תיקיות, לפי סדר, והקבצים המחופשים:
1. {CurrentDirectory}\wwwroot
2. {AppContext.BaseDirectory}\wwwroot
In each folder:
Doconut.lic — if found, this is the only file read
Doconut.Viewer.lic — base viewer license
Doconut.Viewer.<Capability>.lic — per-plugin licenses, read only next to Doconut.Viewer.licתחת IIS ו‑IIS Express, AppContext.BaseDirectory היא תיקיית השורש של האתר — זו שמכילה את Web.config — ולא תיקיית bin שלו. לכן הרישיון צריך להיות ב‑wwwroot תחת שורש האתר:
MySite\
Web.config
Global.asax
bin\
wwwroot\
Doconut.Viewer.lic
Doconut.Viewer.Converter.licבפרויקט, שמור את wwwroot\*.lic לצד Web.config ופרוס את התיקייה עם האתר. אין צורך שלב בנייה שיתעתק אותו לשום מקום. קובץ .lic במיקום אחר — ב‑bin\, לצד Web.config, או בתת‑תיקייה של wwwroot — לעולם לא נקרא.
שמור קבצי
.licמחוץ לבקרת גרסאות. פרוס אותם לצד האתר, או ספק את הרישיון דרךLicenseContentאוLicenseStreamמהחנות הסודית שלך.
מה קורה ללא רישיון
רישיון חסר אינו גורם לחריגה. DoconutHost.Initialize מצליח, האתר מתחיל, והצופה פועל, אך כל דף מציג סימן מים של הערכה ואין שום יכולת אופציונלית שמוענקת.
קובץ רישיון שנמצא אך נדחה הוא שונה. חתימה לא תקפה, שינוי בלתי מורשה, או בנייה מחוץ לתקופת התוקף של הרישיון גורמים ל‑OpenDocumentAsync לזרוק LicenseException עם הסיבה.
תוספים צריכים רישיון שלהם בזמן האתחול
רישום תוסף שהיכולת שלו אינה מורשית ברישיון עוצר את היישום בזמן האתחול. DoconutHost.Initialize זורק חריגה ב‑Application_Start:
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.תחת System.Web, אינך רואה את ההודעה בדפדפן. כל בקשה לאתר מחזירה 500 ריק — ללא דף שגיאה, ללא עקבות מחסנית, ללא דבר ביומן של IIS. החריגה נרשמת רק ב‑יומן אירועי Windows (יומן יישומים, מקור ASP.NET). אם כל האתר מפסיק להגיב מיד לאחר שהוספת שורת AddPlugin, בדוק את קבצי הרישיון ב‑wwwroot לפני הקוד: קובץ הרישיון של התוסף Doconut.Viewer.<Capability>.lic חייב להיות לצד Doconut.Viewer.lic, וללא רישיון הבסיס קבצי התוסף לא נקראים כלל.
אימות הרישיון שהוטען
IDoconutLicenseService הוא מקור האמת שבו משתמש ה‑SDK. קבל אותו מ‑DoconutHost.Services כדי לחשוף נקודת קצה אבחונית מאומתת או לנהל דגלי תכונות — לעולם אל תחזיר את תוכן הרישיון:
// GET /License/Status
public ActionResult Status()
{
var license = Doconut.DoconutHost.Services.GetRequiredService<IDoconutLicenseService>();
return Json(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
}, JsonRequestBehavior.AllowGet);
}הרישיון נקרא פעם אחת, ב‑DoconutHost.Initialize. לאחר החלפת קובץ רישיון, יש למחזר את בריכת היישומים (או לגעת ב‑Web.config) כדי ש‑Application_Start ירוץ שוב.
פתרון בעיות
| תסמין | סיבה סבירה | בדיקה |
|---|---|---|
| הצופה פועל אך כל דף מסומן במים | לא נמצא רישיון | האם הקובץ .lic נמצא ב‑<site root>\wwwroot? קרא את נקודת הקצה למצב למעלה |
כל בקשה מחזירה 500 ריק מיד אחרי הוספת תוסף | תוסף רשום ללא רישיון המעניק לו | יומן אירועי Windows, מקור ASP.NET; קובץ .lic של התוסף לצד Doconut.Viewer.lic |
LicensePath עובד במחשב שלך אך לא בשרת | נתיב יחסי שנפתר ביחס לתיקיית תהליך העובד | בנה זאת עם HostingEnvironment.MapPath("~/wwwroot/...") |
קובץ .lic שהוחלף לא משפיע | הרישיון נקרא כאשר היישום התחיל | מחזר את בריכת היישומים |
OpenDocumentAsync זורק LicenseException | הרישיון נמצא אך נדחה | קרא את הודעת החריגה; אל תציג אותה ללקוחות לא מהימנים |
צעדים הבאים
- רישוי — יכולות, וכיצד לבדוק אותן בזמן ריצה.
- פתרון בעיות — סימני מים, כשלונות באתחול, ותסמינים אחרים.
האם דף זה היה מועיל?