הגדרת רישיון

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

צעדים הבאים

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

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