הגדרת רישיון

היכן Doconut מחפש את קובץ הרישיון שלך תחת IIS

ללא רישיון, Doconut עדיין מציג מסמכים — כל דף מציג סימן מים של הערכה. דף זה מסביר את ארבעת הדרכים לספק רישיון ב‑Global.asax, היכן Doconut מחפש כאשר לא מסופק רישיון, ומה קורה כאשר רישיון של תוסף חסר.

ארבע דרכים לספק רישיון

יש שלושה מקורות מפורשים ב‑DoconutOptions — נתיב קובץ, זרם, או תוכן גולמי — בנוסף לגילוי אוטומטי כאשר אף אחד מהם אינו מוגדר. כולם נקראים פעם אחת, ב‑DoconutHost.Initialize. כאשר מוגדרים יותר מאחד, סדר העדיפות הוא מדויק:

LicenseStream גובר על LicenseContent גובר על LicensePath גובר על גילוי אוטומטי.

לפי נתיב

ספק ל‑LicensePath נתיב מלא. נתיב יחסי נפתר ביחס לתיקייה הנוכחית של התהליך, וב‑IIS זו תיקיית תהליך העובד עצמו, ולא של האתר שלך. HostingEnvironment.MapPath ממיר נתיב יחסי של האתר לנתיב מלא:

csharp
Doconut.DoconutHost.Initialize(options =>
{
    options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
});

אם הקובץ אינו קיים, Doconut לא זורק חריגה ולא חוזר לגילוי אוטומטי: הוא לא טוען רישיון, והצופה מציג סימן מים. קבצי הרישיון של תוספים באותה תיקייה (Doconut.Viewer.<Capability>.lic) נקראים יחד איתו, ולכן LicensePath ו‑AddPlugin<...>() פועלים יחד כאשר רישיונות התוספים נמצאים לצד רישיון הבסיס.

לפי זרם

LicenseStream נקרא פעם אחת, בזמן האתחול — שימושי כאשר הרישיון מגיע ממשאב משובץ או מחנות סודית במקום קובץ על הדיסק.

csharp
// Precedence: LicenseStream > LicenseContent > LicensePath > auto-search.
Doconut.DoconutHost.Initialize(options =>
{
    options.LicenseStream = licenseStream;
});

לפי תוכן

LicenseContent מקבל את טקסט הרישיון עצמו — ממשתנה סביבתי, ממסד נתונים, או מחנות סודית — ולכן אין צורך לפרוס קובץ רישיון עם האתר.

csharp
// 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 יחפש את הרישיון בעצמו:

csharp
// 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();

השתי תיקיות, לפי סדר, והקבצים המחופשים:

text
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 תחת שורש האתר:

text
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:

text
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 כדי לחשוף נקודת קצה אבחונית מאומתת או לנהל דגלי תכונות — לעולם אל תחזיר את תוכן הרישיון:

csharp
// 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הרישיון נמצא אך נדחהקרא את הודעת החריגה; אל תציג אותה ללקוחות לא מהימנים

צעדים הבאים

  • רישוי — יכולות, וכיצד לבדוק אותן בזמן ריצה.
  • פתרון בעיות — סימני מים, כשלונות באתחול, ותסמינים אחרים.

האם דף זה היה מועיל?