הגדרת רישיון

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

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

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

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

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

לפי נתיב

LicensePath מועבר ל‑File.Exists בדיוק כפי שניתן. נתיב יחסי נפתר יחסית ל‑ספריית העבודה הנוכחית של התהליך — לא לתיקיית הפרויקט שלך, ולא לתיקייה שבה נמצא Program.cs. אם הנתיב אינו נפתר, Doconut לא זורק חריגה ולא נופל לחיפוש אוטומטי — הוא פשוט לא טוען רישיון והצופה מציג סימן מים. חיפוש אוטומטי פועל רק כאשר אף אחד מ‑LicensePath, LicenseContent, או LicenseStream אינו מוגדר.

העדף נתיב מוחלט (למשל שנבנה מ‑IWebHostEnvironment.WebRootPath או AppContext.BaseDirectory), או דלג על LicensePath לחלוטין והסתמך על הגילוי האוטומטי למטה.

csharp
builder.Services.AddDoconut(options =>
{
    options.LicensePath = Path.Combine(AppContext.BaseDirectory, "Doconut.Viewer.lic");
});

לפי זרם

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

csharp
// Precedence: LicenseStream > LicenseContent > LicensePath > auto-search.
builder.Services.AddDoconut(options =>
{
    options.LicenseStream = licenseStream;
});

לפי תוכן

LicenseContent מקבל את טקסט הרישיון עצמו — ממשתנה סביבתי, ממסד נתונים, או ממנהל סודות:

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

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

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

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

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

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.

ההודעה אומרת לך את הפתרון ישירות: או להסיר את קריאת options.AddPlugin<...>() עבור תוסף זה, או להתקין רישיון בתשלום או רישיון זמני/דמו (NFR) פעיל שמעניק את היכולת. הרשמות זמניות מותרות לשרוד את תאריך הפקתם כך שאפליקציה שכבר הוגדרה יכולה להתדרדר בזמן ריצה במקום לקרוס בזמן אתחול; לאחר שפג תוקף, היכולות שלהם עדיין מבוטלות.

אמת את הרישיון הטעון

השתמש ב‑IDoconutLicenseService, מקור האמת שבו משתמש ה‑SDK, כדי לחשוף נקודת קצה אבחונית מאומתת או להניע דגלוני תכונה. אל תחזיר את תוכן הרישיון או מפתחות.

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

צעדים הבאים

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

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