הגדרת רישיון

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

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

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

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

LicenseStream מנצח על LicenseContent מנצח על LicensePath מנצח על חיפוש אוטומטי.

לפי נתיב

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

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

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

בזרם

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

csharp
// קדימות: LicenseStream > LicenseContent > LicensePath > חיפוש-אוטומטי.
builder.Services.AddDoconut(options =>
{
    options.LicenseStream = licenseStream;
});

בתוכן

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

csharp
// קובץ XML של רישיון ממסד נתונים, משתנה סביבתי, או מנהל סודות —
// אין קובץ על הדיסק. נחלץ רק על‑ידי LicenseStream.
builder.Services.AddDoconut(options =>
{
    options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});

גילוי אוטומטי

אל תגדיר אף אחד משלושת המקורות המפורשים, ו‑Doconut יחפש את הרישיון בעצמו:

csharp
// אל תגדיר דבר, ו‑Doconut יחפש את הרישיון בעצמו, רק בשתי התיקיות האלה:
//   1. {CurrentDirectory}/wwwroot
//   2. {AppContext.BaseDirectory}/wwwroot   (wwwroot בתוך תיקיית פלט הבנייה)
// הוא מחפש תחילה את Doconut.lic, ואז Doconut.Viewer.lic, בנוסף לכל קובץ per-plugin
// Doconut.Viewer.<Capability>.lic קבצים לצד זה.
builder.Services.AddDoconut();

תיקיות הסריקה, לפי סדר, ושמות הקבצים (נבדקים בכל תיקייה למעלה, לפי סדר):

text
1. {CurrentDirectory}/wwwroot
2. {AppContext.BaseDirectory}/wwwroot

Filenames (checked in each folder above, in order):
  Doconut.lic                          — base viewer license (checked first)
  Doconut.Viewer.lic                   — base viewer license
  Doconut.Viewer.<Capability>.lic      — per-plugin license, alongside the base license

שום דבר מחוץ לתיקיית wwwroot אינו נקרא: .lic בתיקיית הפלט עצמה, או בwwwroot/lib, מתעלמים ממנו.

העתק את הרישיון לתיקיית הפלט שלך

כאשר התהליך אינו רץ מתיקיית הפרויקט — אפליקציה מפורסמת, IIS, מכולה, רץ מבחן — הסריקה הראשונה מפספסת, והשנייה, {AppContext.BaseDirectory}/wwwroot, חייבת למצוא את הקובץ. אפליקציית הבדיקה של ה‑SDK מעתיקה את הרישיונות לשם בכל בנייה עם יעד MSBuild זה:

xml
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
  <ItemGroup>
    <DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
    <StaleOutputLicenses Include="$(OutDir)wwwroot\*.lic" />
  </ItemGroup>
  <!-- מחק תחילה, כך ששינוי שם או הסרת .lic ב‑wwwroot גם יוציא אותו מהפלט. -->
  <Delete Files="@(StaleOutputLicenses)" />
  <Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)wwwroot" />
</Target>

היעד חייב להיות $(OutDir)wwwroot: .lic שמועתק לשורש הפלט לעולם לא נמצא על ידי חיפוש אוטומטי. הדוגמאות של LicensePath בעמוד זה מצביעות על אותו מקום.

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

צעדים הבאים

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

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