การให้สิทธิ์
ความสามารถ, ระดับใบอนุญาต, และบริการใบอนุญาต
หน้าเว็บนี้เป็นเอกสารอ้างอิงเวลารันสำหรับวิธีที่ใบอนุญาตกำหนดพฤติกรรมของ Doconut: สิ่งที่แต่ละสถานะใบอนุญาตอนุญาต, วิธีที่ความสามารถได้รับการให้สิทธิ์, และวิธีตรวจสอบทั้งหมดจากโค้ด (สำหรับ การโหลด ใบอนุญาต, ดู ตั้งค่าใบอนุญาต.)
สถานะใบอนุญาตและหน้าที่ของแต่ละสถานะ
| สถานะ | เปิดเอกสารได้หรือไม่ | ลายน้ำ | ความสามารถ |
|---|---|---|---|
| ใบอนุญาตเต็ม (ชำระเงิน) (ภายในหน้าต่างการสมัครสมาชิก/อัปเดตของมัน) | ใช่ | ไม่มี | สิ่งที่ซื้อ (Has* flags) |
| ใบอนุญาตชั่วคราว (นักพัฒนา/NFR — ใบอนุญาตประเมิน, ก่อนวันที่หมดอายุ) | ใช่ | ไม่มี | ทั้งหมด — ให้สิทธิ์แบบรวม (กระบวนการประเมิน) |
| หมดอายุ (ใบอนุญาตชั่วคราวที่พ้นวันหมดอายุ, หรือการสมัครชำระเงินที่พ้นวันต่ออายุ) | ใช่ | ลายน้ำการประเมิน | ไม่มีการให้สิทธิ์ |
| ไม่มีไฟล์ใบอนุญาตเลย | ใช่ | ลายน้ำการประเมิน | ไม่มีการให้สิทธิ์ |
| พบแต่ถูกปฏิเสธ (ลายเซ็นไม่ถูกต้อง, ถูกดัดแปลง, ถูกบล็อค, หรือบิลด์ใหม่กว่าหน้าต่างเวอร์ชันของใบอนุญาต) | ไม่มี — LicenseException on every open | — | — |
สองผลลัพธ์ที่ควรเข้าใจ:
- การไม่มีใบอนุญาตไม่ใช่ใบอนุญาตชั่วคราว. หากไม่มีไฟล์ใบอนุญาต, หน้าเว็บจะแสดงลายน้ำและไม่มีความสามารถใด ๆ (การค้นหา, การอธิบาย, ปลั๊กอิน) ทำงาน. ประสบการณ์เต็มรูปแบบโดยไม่มีลายน้ำต้องการ ใบอนุญาตชั่วคราว (รับใบอนุญาตชั่วคราว).
- เฉพาะใบอนุญาตที่ถูกปฏิเสธเท่านั้นที่บล็อกการเปิด. การหมดอายุของปฏิทิน/การสมัครสมาชิกทำให้การแสดงผลเป็นลายน้ำ; แต่การปรับใช้บิลด์ที่ ใหม่กว่า หน้าต่างเวอร์ชันของใบอนุญาตจะถูกปฏิเสธและ ล้มเหลวอย่างรวดเร็ว ด้วย
LicenseException, ดังนั้นคุณจะจับได้ในขั้นตอนการปรับใช้ — ไม่ใช่โดยการส่งออกที่มีลายน้ำโดยเงียบ. ข้อยกเว้นนั้น (จากOpenDocumentAsync) มีเหตุผลจากLicense.RejectionMessage.
ความสามารถ
Doconut ควบคุมฟังก์ชันการทำงานเสริมโดย ความสามารถ. ปัจจุบันมีปลั๊กอิน Converter และ DICOM ที่เลือกใช้ รวมถึงฟีเจอร์ การค้นหา และ การอธิบาย ที่มีมาในตัว, แต่ละอย่างได้รับสิทธิ์จากใบอนุญาตของคุณ. ตัวดูพื้นฐานไม่ใช่ความสามารถ — เป็นเงื่อนไขเบื้องต้น, แสดงเป็น IsViewerLicensed:
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's versionเกตเดียวที่ทั้ง pipeline ใช้คือ IsCapabilityGranted:
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);ตรรกะของมัน, ตามที่เขียนไว้ในโค้ด: ใบอนุญาต ชั่วคราว ที่ใช้งานอยู่ (ไม่หมดอายุ) ให้สิทธิ์ ทุก ความสามารถ — รวมถึงความสามารถที่ยังไม่มีแฟล็กการซื้อเฉพาะ; ใบอนุญาตที่ซื้อจริงจะให้สิทธิ์ตาม Has* flags เท่านั้นและเป็น การปฏิเสธโดยค่าเริ่มต้น สำหรับสิ่งที่ไม่ได้แมปไว้. (ไฟล์ประเภท TRIAL เก่า ไม่ใช่ สิทธิ์ — ถือว่าไม่มีใบอนุญาต: มีลายน้ำ, ไม่มีการให้สิทธิ์ใด ๆ.)
ใบอนุญาตชั่วคราว
ใบอนุญาตชั่วคราว (Developer/NFR) จะถูกทำเครื่องหมายด้วยแท็ก ExpiryNote และมีวันหมดอายุที่กำหนดอย่างชัดเจน:
| สมาชิก | ความหมาย |
|---|---|
IsTemporary | มีแท็ก ExpiryNote อยู่ (การตรวจจับทำโดยการมีแท็ก — ไม่ต้องจับคู่ข้อความของโน้ต, เป็นค่าที่เปลี่ยนแปลงได้) |
ExpiryNote | ข้อความข้อมูลที่ฝังอยู่ในใบอนุญาต |
LicenseExpiry | วันหมดอายุที่กำหนด (DateTime?) |
ความหมายของวันหมดอายุแตกต่างตามระดับ: ใบอนุญาตชั่วคราวจะหมดอายุที่ วันที่ ของ LicenseExpiry เท่านั้น (หน้าต่างการสมัครสมาชิกจะถูกละเลย; ใบอนุญาตชั่วคราวที่ไม่มีวันที่จะถือว่าหมดอายุ, ปลอดภัย). ใบอนุญาตอื่น ๆ จะหมดอายุที่วันที่ของหน้าต่างการสมัครสมาชิก/อัปเดต.
อ้างอิง IDoconutLicenseService
ดึง IDoconutLicenseService (namespace Doconut.Core.Interfaces) จาก DoconutHost.Services. มันเป็น singleton — ใบอนุญาตจะถูกแยกวิเคราะห์หนึ่งครั้งใน DoconutHost.Initialize:
| สมาชิก | ความหมาย |
|---|---|
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.
// 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 ไม่มี endpoint สุขภาพของตัวเอง, ดังนั้นให้เปิดเผยจากคอนโทรลเลอร์:
// 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 โหลดใบอนุญาตใหม่.
หน้านี้เป็นประโยชน์หรือไม่?