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