רישוי

יכולות, רמות רישיון ושירות הרישיון

דף זה הוא ההתייחסות בזמן ריצה לאופן שבו רישיון מעצב את ההתנהגות של Doconut: מה כל מצב רישיון מאפשר, איך ניתנות היכולות, ואיך לבדוק את כל זה מהקוד. (לטעינה רישיון, ראה התחלה → הגדרת רישיון.)

מצבי רישיון ומה הם עושים

מצבפותח מסמכים?סימן מיםיכולות
רישיון מלא (בתשלום) (בתוך חלון המנוי/עדכון שלו)כןאיןההן שנרכשו (Has* flags)
רישיון זמני (Developer/NFR — רישיון ההערכה, לפני תאריך הפקיעה)כןאיןהכול — מתן כולל (תהליך ההערכה)
פג תוקף (רישיון זמני שעבר את תאריך הפקיעה שלו, או מנוי בתשלום שעבר את תאריך החידוש)כןסימן מים של הערכהלא ניתנה
אין קובץ רישיון כללכןסימן מים של הערכהלא ניתנה
נמצא אך נדחה (חתימה לא תקפה, שונה, ברשימה שחורה, או בנייה חדשה יותר מחלון הגרסה של הרישיון)לא — LicenseException בכל פתיחה

שתי השלכות שכדאי להטמיע:

  • חוסר רישיון אינו רישיון זמני. ללא קובץ רישיון, הדפים מוצגים עם סימן מים ואין יכולת (חיפוש, הערה, תוספים) פעילה. החוויה המלאה ללא סימן מים דורשת רישיון זמני (קבל אחד).
  • רק רישיון שנדחה חוסם פתיחה. פקיעת לוח שנה/מנוי מובילה להצגת סימן מים; אך פריסת בנייה חדשה יותר מחלון הגרסה של הרישיון נדחית ונכשלת מיידית עם LicenseException, כך שאתה תופס זאת בפריסה — ולא על ידי שליחת פלט עם סימן מים בשקט. החריגה (מ-OpenDocumentAsync) נושאת את הסיבה מ-License.RejectionMessage.

יכולות

Doconut מגביל פונקציונליות אופציונלית באמצעות יכולת. היום אלו תוספי Converter ו-DICOM בתוספת תכונות מובנות Search ו-Annotation, שכל אחת ניתנת לפי הרישיון שלך. הצופה הבסיסי אינו יכולת — הוא דרישה מוקדמת, מוצג כ-IsViewerLicensed:

csharp
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's version

השער היחיד שכל הצינור משתמש בו הוא IsCapabilityGranted:

csharp
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);

ההיגיון שלו, במילה במילה מהיישום: רישיון זמני פעיל (לא פג תוקף) מעניק כל היכולת — כולל יכולות שאין להן עדיין דגל רכישה ייעודי; רישיון שנרכש במלואו מעניק בדיוק את דגלי Has* שלו והוא דיפולט-דחייה לכל דבר שלא ממופה. (קובץ מסוג TRIAL ישן אינו זכאות — הוא מטופל כלא מורשה: עם סימן מים, ללא כל אפשרות.)

רישיונות זמניים

חיפוש והערה רגילים משתמשים ביכולות הקיימות שלהם ישירות.

רישיונות זמניים (Developer/NFR) מסומנים בתג ExpiryNote ונושאים תאריך פקיעה קבוע:

חברמשמעות
IsTemporaryתג ExpiryNote קיים (הזיהוי נעשה על ידי נוכחות התג — לעולם לא תואם לטקסט ההערה, זה דינמי)
ExpiryNoteטקסט מידע משובץ ברישיון
LicenseExpiryתאריך הפקיעה הקבוע (DateTime?)

המשמעות של פקיעה שונה לפי רמה: רישיון זמני פג בתאריך LicenseExpiry רק (חלון המנוי שלו מתעלמים ממנו; רישיון זמני ללא תאריך נחשב כפג תוקף, בטוח). כל רישיון אחר פג בתאריך חלון המנוי/עדכון שלו.

הפנייה ל-IDoconutLicenseService

הזרק IDoconutLicenseService (מרחב שמות Doconut.Core.Interfaces; נרשם כסינגלטון — הרישיון מפוענח פעם אחת בעת ההפעלה):

חברמשמעות
Licenseתמונת מצב מלאה של DoconutLicenseInfo (להלן)
IsTrialקובץ מסוג TRIAL ישן (מתייחס כלא מורשה — לא זכאות)
IsTemporary / ExpiryNote / LicenseExpiryסמנים של רישיון זמני
IsExpiredפג לפי כללי הרמה למעלה
IsVersionValidבנייה זו נמצאת בתוך חלון התמיכה של הרישיון
IsViewerLicensedקובץ שאינו TRIAL נמצא ו גרסה מכוסה — דרישה מוקדמת בסיסית
IsCapabilityGranted(cap)שער היכולת היחיד
HasSearch HasAnnotation HasConverter HasDicomשוחררו לפי דגלי רכישה לכל יכולת — השתמש ב-IsCapabilityGranted לקבלת תשובה מודעת זמנית
IsValidForDomain(host)כיסוי מארח; רישיונות V4 משתמשים בתו הכללי *.*
LicenseRejectionReasonלא ריק ⇒ פתיחה חסומה עם הודעה זו

DoconutLicenseInfo מציג את תמונת המצב הידידותית לתצוגה עבור לוחות ניהול: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, דגלי Has*, השדות של רישיון זמני, ו-RejectionMessage.

csharp
// Feature-flag your UI from the same source of truth the SDK uses
app.MapGet("/api/features", (IDoconutLicenseService lic) => Results.Ok(new
{
    viewer     = lic.IsViewerLicensed || lic.IsTemporary,
    search     = lic.IsCapabilityGranted(LicenseCapability.Search),
    annotation = lic.IsCapabilityGranted(LicenseCapability.Annotation),
    conversion = lic.HasConverter,
    dicom      = lic.HasDicom,
}));

בדיקת בריאות

AddDoconut() רושמת בדיקת בריאות "doconut" המדווחת על מצב רישיון/פקיעה דרך המנגנון הסטנדרטי של ASP.NET Core:

csharp
app.MapHealthChecks("/health");

חבר זאת למערכת המעקב שלך והמנוי המתקרב לפקיעה יהפוך להתראה במקום פנייה לתמיכה.

עדכוני גרסה

רישיון מכסה חלון גרסה. עדכון חבילת NuGet לבנייה חדשה יותר מהחלון הופך את הרישיון ללא תקף עבור בנייה זו: IsVersionValid הופך ל-false ופתיחה חסומה עם LicenseException (הסיבה ב-License.RejectionMessage) — כוונה לכשל מהיר, כך שבנייה ישנה או בלתי מורשית נתפסת בפריסה במקום לסמן במים את הפלט בשקט. חידש את המנוי, החלף את קובץ .lic, והפעל מחדש את היישום כך ש-AddDoconut() תטען את הרישיון החדש.

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