การตั้งค่าใบอนุญาต

ที่ที่ Doconut มองหาไฟล์ใบอนุญาตของคุณ

หากไม่มีใบอนุญาต, Doconut ยังคงแสดงเอกสาร — ทุกหน้าจะมีลายน้ำการประเมินเท่านั้น หน้าเอกสารนี้อธิบายวิธีสี่วิธีในการจัดหาใบอนุญาต, และลำดับความสำคัญที่แน่นอนเมื่อมีการตั้งค่ามากกว่าหนึ่งวิธี.

สี่วิธีในการจัดหาใบอนุญาต

มีทั้งหมดสี่วิธี: แหล่งที่มาชัดเจนสามแหล่งบน DoconutOptions — สตรีม, เนื้อหาดิบ, หรือเส้นทางไฟล์ — พร้อมกับการค้นหาอัตโนมัติเมื่อไม่มีการตั้งค่าใด ๆ เมื่อมีการตั้งค่ามากกว่าหนึ่งแหล่ง ลำดับความสำคัญจะเป็นดังนี้:

LicenseStream ชนะ LicenseContent ชนะ LicensePath ชนะ auto-search.

ตามเส้นทาง

LicensePath จะถูกส่งไปยัง File.Exists ตามที่ระบุไว้เสมอ เส้นทางสัมพันธ์จะถูกแก้ไขโดยอ้างอิงจาก ไดเรกทอรีทำงานปัจจุบัน ของกระบวนการ — ไม่ใช่โฟลเดอร์โปรเจคของคุณ, และไม่ใช่โฟลเดอร์ที่ Program.cs อยู่ หากเส้นทางไม่สามารถแก้ไขได้ Doconut จะไม่ขว้างข้อยกเว้นและ ไม่ กลับไปใช้การค้นหาอัตโนมัติ — มันจะเพียงแค่ไม่โหลดใบอนุญาตและตัวดูจะแสดงลายน้ำ การค้นหาอัตโนมัติจะทำงานเฉพาะเมื่อไม่มีการตั้งค่า LicensePath, LicenseContent, หรือ LicenseStream

แนะนำให้ใช้เส้นทางแบบเต็ม (เช่น สร้างจาก IWebHostEnvironment.WebRootPath หรือ AppContext.BaseDirectory), หรือข้ามการตั้งค่า LicensePath ทั้งหมดและพึ่งพาการค้นหาอัตโนมัติด้านล่าง.

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

ตามสตรีม

LicenseStream จะถูกอ่านหนึ่งครั้งเมื่อตอนเริ่มต้น — มีประโยชน์เมื่อใบอนุญาตมาจากที่เก็บความลับแทนไฟล์บนดิสก์.

csharp
// Precedence: LicenseStream > LicenseContent > LicensePath > auto-search.
builder.Services.AddDoconut(options =>
{
    options.LicenseStream = licenseStream;
});

ตามเนื้อหา

LicenseContent รับข้อความใบอนุญาตโดยตรง — จากตัวแปรสภาพแวดล้อม, ฐานข้อมูล, หรือผู้จัดการความลับ:

csharp
// License XML from a database, environment variable, or secret manager —
 // no file on disk. Beaten only by LicenseStream.
builder.Services.AddDoconut(options =>
{
    options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});

การค้นหาอัตโนมัติ

ไม่กำหนดค่าใด ๆ ของแหล่งที่มาชัดเจนทั้งสาม, แล้ว Doconut จะค้นหาใบอนุญาตด้วยตนเอง:

csharp
// Configure nothing, and Doconut searches for the license itself:
//   1. {CurrentDirectory}/wwwroot
//   2. {CurrentDirectory}/wwwroot/lib
//   3. AppContext.BaseDirectory  (the build output folder)
// It looks for Doconut.Viewer.lic plus any per-plugin
// Doconut.Viewer.<Capability>.lic files alongside it.
builder.Services.AddDoconut();

ไดเรกทอรีที่ตรวจสอบตามลำดับ, และชื่อไฟล์ที่ค้นหาในแต่ละไดเรกทอรี:

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

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

คัดลอกใบอนุญาตไปยังโฟลเดอร์ผลลัพธ์ของคุณ

LicensePath และการตรวจสอบ AppContext.BaseDirectory ของการค้นหาอัตโนมัติ ทั้งสองต้องการไฟล์ .lic อยู่ข้างแอปที่สร้าง — ไม่ใช่แค่ใน wwwroot ของแหล่งที่มา SDK มีแอปทดสอบที่คัดลอกไฟล์นี้ในทุกการสร้างด้วยเป้าหมาย MSBuild นี้:

xml
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
  <ItemGroup>
    <DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
  </ItemGroup>
  <Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
</Target>

อย่าเก็บไฟล์ .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<...>() สำหรับปลั๊กอินนั้นออก, หรือทำการติดตั้งใบอนุญาตแบบชำระเงินหรือใบอนุญาต Temporary/Demo (NFR) ที่ใช้งานได้ซึ่งให้ความสามารถนั้น การลงทะเบียนแบบชั่วคราวจะได้รับอนุญาตให้คงอยู่หลังจากวันหมดอายุเพื่อให้แอปที่กำหนดค่าแล้วสามารถทำงานในโหมดลดคุณภาพได้ในขณะรันไทม์แทนการหยุดทำงานระหว่างการรีสตาร์ท; เมื่อหมดอายุ ความสามารถของพวกมันยังคงถูกเพิกถอน

ตรวจสอบใบอนุญาตที่โหลด

ใช้ IDoconutLicenseService ซึ่งเป็นแหล่งข้อมูลที่เชื่อถือได้เดียวกันที่ SDK ใช้, เพื่อเปิดเผย endpoint การวินิจฉัยที่ผ่านการตรวจสอบสิทธิ์หรือเพื่อควบคุมฟีเจอร์ฟล็อก อย่าเปิดเผยเนื้อหาใบอนุญาตหรือคีย์

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 ที่เปลี่ยนใหม่ไม่มีผลบริการใบอนุญาตแบบ singleton ถูกสร้างแล้วรีสตาร์ทแอปพลิเคชัน
OpenDocumentAsync ขว้าง LicenseExceptionลายเซ็น, โดเมน, ช่วงเวอร์ชัน, รายการดำเนินการห้าม, หรือเกตเวย์รันไทม์ของปลั๊กอิน ... ปฏิเสธใบอนุญาตอ่านข้อความข้อยกเว้น/ปฏิเสธโดยไม่เปิดเผยต่อคลไอเอนต์ที่ไม่เชื่อถือ

ขั้นตอนต่อไป

  • การให้ใบอนุญาต — ความสามารถ, ระดับใบอนุญาต, และการตรวจสอบสิ่งที่โหลดในขณะรันไทม์.
  • การแก้ไขปัญหา — ลายน้ำ, ใบอนุญาตที่ถูกปฏิเสธ, และข้อผิดพลาดของความสามารถ.

หน้านี้เป็นประโยชน์หรือไม่?