רישוי
יכולות, רמות רישיון ושירות הרישיון
דף זה הוא ההתייחסות בזמן ריצה לאופן שבו רישיון משפיע על ההתנהגות של Doconut: מה כל מצב רישיון מאפשר, איך ניתנות היכולות, ואיך לבדוק את כל זה מהקוד. (לטעינת רישיון, ראה הגדרת רישיון.)
מצבי רישיון ומה הם עושים
| מצב | פותח מסמכים? | סימן מים | יכולות |
|---|---|---|---|
| רישיון מלא (בתשלום) (בתוך חלון המנוי/עדכון שלו) | כן | אין | ההן שנרכשו (Has* flags) |
| רישיון זמני (Developer/NFR — רישיון ההערכה, לפני תאריך התפוגה שלו) | כן | אין | הכל — מתן כולל (המשפך של ההערכה) |
| פג תוקף (רישיון זמני אחרי תאריך התפוגה שלו, או מנוי בתשלום אחרי תאריך החידוש) | כן | סימן מים של הערכה | לא ניתנה שום אפשרות |
| אין קובץ רישיון כלל | כן | סימן מים של הערכה | לא ניתנה שום אפשרות |
| נמצא אך נדחה (חתימה לא חוקית, שונה, ברשימה שחורה, או בנייה חדשה יותר מחלון הגרסה של הרישיון) | לא — LicenseException בכל פתיחה | — | — |
שתי תוצאות שכדאי להטמיע:
- חוסר רישיון אינו רישיון זמני. ללא קובץ רישיון, הדפים מוצגים עם סימן מים ואין שום יכולת (חיפוש, הערה, תוספים) פעילה. החוויה המלאה ללא סימן מים דורשת רישיון זמני אמיתי (קבל אחד).
- רק רישיון שנדחה חוסם פתיחה. תפוגת לוח שנה/מנוי מתחלפת להצגת סימן מים; אך פריסת בנייה חדשה יותר מחלון הגרסה של הרישיון נדחית ונכשלת מיידית עם
LicenseException, ולכן אתה תופס אותה בפריסה — ולא על ידי שליחת פלט עם סימן מים בשקט. חריגה זו (מ‑OpenDocumentAsync) נושאת את הסיבה מ‑License.RejectionMessage.
יכולות
Doconut מגביל פונקציונליות אופציונלית באמצעות יכולת. היום אלו תוספי Converter ו‑DICOM שניתן לבחור, בנוסף לתכונות המובנות Search ו‑Annotation, שכל אחת מהן ניתנת לפי הרישיון שלך. הצופה הבסיסי אינו יכולת — הוא דרישה מוקדמת, מוצג כ‑IsViewerLicensed:
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's versionהשער היחיד שכל הצינור משתמש בו הוא IsCapabilityGranted:
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);ההיגיון שלו, במילה במילה מהיישום: רישיון זמני פעיל (שאינו פג תוקף) מעניק כל היכולת — כולל יכולות שאין להן עדיין דגל רכישה ייעודי; רישיון שנרכש בפועל מעניק בדיוק את דגלי Has* שלו והוא דיפולט-דחייה לכל דבר שלא ממופה. (קובץ מסוג TRIAL ישן אינו זכות — הוא מתtreated כלא מורשה: עם סימן מים, ללא שום אפשרות.)
רישיונות זמניים
רישיונות זמניים (Developer/NFR) מסומנים בתג ExpiryNote ונושאים תאריך תפוגה קבוע:
| חבר | משמעות |
|---|---|
IsTemporary | תג ExpiryNote קיים (הזיהוי נעשה על ידי נוכחות התג — לעולם אל תתאים לטקסט של ההערה, הוא דינמי) |
ExpiryNote | טקסט מידע משובץ ברישיון |
LicenseExpiry | תאריך תפוגה קבוע (DateTime?) |
המשמעות של התפוגה שונה לפי רמה: רישיון זמני פג בתאריך LicenseExpiry רק (חלון המנוי שלו מתעלמים ממנו; רישיון זמני ללא תאריך מתייחס כפג, בטוח). כל רישיון אחר פג בתאריך חלון המנוי/עדכון שלו.
הפנייה ל‑IDoconutLicenseService
אתר את IDoconutLicenseService (מרחב שמות Doconut.Core.Interfaces) מ‑DoconutHost.Services. הוא סינגלטון — הרישיון מפוענח פעם אחת, ב‑DoconutHost.Initialize:
| חבר | משמעות |
|---|---|
License | תמונת מצב מלאה של DoconutLicenseInfo (להלן) |
IsTrial | קובץ מסוג TRIAL ישן (מתtreated כלא מורשה — לא זכות) |
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.
// GET /Features - feature-flag your UI from the same source of truth the SDK uses
public ActionResult Index()
{
var lic = Doconut.DoconutHost.Services.GetRequiredService<IDoconutLicenseService>();
return Json(new
{
viewer = lic.IsViewerLicensed || lic.IsTemporary,
search = lic.IsCapabilityGranted(LicenseCapability.Search),
annotation = lic.IsCapabilityGranted(LicenseCapability.Annotation),
conversion = lic.HasConverter,
dicom = lic.HasDicom,
}, JsonRequestBehavior.AllowGet);
}בדיקת בריאות
Doconut רושמת בדיקת בריאות "doconut" המדווחת על מצב הרישיון. ל‑Classic ASP.NET אין נקודת קצה לבריאות משלה, ולכן חשוף אותה מבקר:
// GET /Health - Doconut registers a "doconut" health check that reports the license state:
// Healthy (valid), Degraded (trial or no license file), Unhealthy (expired).
public async Task<ActionResult> Index()
{
var health = Doconut.DoconutHost.Services.GetRequiredService<HealthCheckService>();
HealthReport report = await health.CheckHealthAsync();
Response.StatusCode = report.Status == HealthStatus.Unhealthy ? 503 : 200;
return Content(report.Status.ToString(), "text/plain");
}חבר זאת למערכת המעקב שלך והסבר מנוי שפג הופך להתראה במקום כרטיס תמיכה. ראה DoconutHost עבור ערכי המצב.
עדכוני גרסה
רישיון מכסה חלון גרסה. עדכון חבילת NuGet לבנייה חדשה יותר מחלון זה גורם לרישיון להיות לא תקף עבור בנייה זו: IsVersionValid הופך ל‑false ופתיחה חסומה עם LicenseException (הסיבה ב‑License.RejectionMessage) — כוונה לכשל מהיר, כך שבנייה מיושנת או לא מורשית נתפסת בפריסה במקום לסמן במים את פלט הייצור בשקט. חידש את המנוי, החלף את קובץ ה‑.lic ב‑wwwroot, והפעל מחדש את בריכת האפליקציות כך ש‑DoconutHost.Initialize יטען את הרישיון החדש.
האם דף זה היה מועיל?