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

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

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

ใบอนุญาตจะถูกโหลด หนึ่งครั้ง, ระหว่าง AddDoconut(). นี่เป็นการเปลี่ยนแปลงจากไลบรารี .NET Standard ก่อนหน้า, ที่ซึ่งใบอนุญาตถูกส่งให้กับอินสแตนซ์ Viewer หรือถูกตั้งค่าผ่านการเรียกใช้แบบสแตติก Viewer.DoconutLicense(...) / Viewer.SetLicensePlugin(...). เมธอดเหล่านั้นไม่ได้เป็นกลไกการเริ่มต้นในรุ่นนี้ — ดูที่ migration guide.

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

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

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

โดยเส้นทาง

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

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

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

โดยสตรีม

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

csharp
// ลำดับความสำคัญ: LicenseStream > LicenseContent > LicensePath > การค้นหาอัตโนมัติ.
builder.Services.AddDoconut(options =>
{
    options.LicenseStream = licenseStream;
});

โดยเนื้อหา

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

csharp
// License XML จากฐานข้อมูล, ตัวแปรสภาพแวดล้อม, หรือผู้จัดการความลับ —
// ไม่มีไฟล์บนดิสก์. แค่ LicenseStream เท่านั้นที่เหนือกว่า.
builder.Services.AddDoconut(options =>
{
    options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});

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

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

csharp
// ไม่ต้องกำหนดค่าใด ๆ, และ Doconut จะค้นหาไลเซนส์ด้วยตนเอง, ในสองโฟลเดอร์ต่อไปนี้เท่านั้น:
//   1. {CurrentDirectory}/wwwroot
//   2. {AppContext.BaseDirectory}/wwwroot   (wwwroot ภายในโฟลเดอร์ผลลัพธ์การสร้าง)
// มันจะมองหา Doconut.lic ก่อน, จากนั้น Doconut.Viewer.lic, และไฟล์ใด ๆ ตามความสามารถ
// ไฟล์ Doconut.Viewer.<Capability>.lic ค้างเคียงกับมัน.
builder.Services.AddDoconut();

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

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

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

ไม่มีอะไรนอกโฟลเดอร์ wwwroot ถูกอ่าน: .lic ในโฟลเดอร์ผลลัพธ์เอง, หรือใน wwwroot/lib, จะถูกละเลย.

หากคุณเคยส่ง List<string> ของเส้นทางใบอนุญาตไปยังคอนสตรัคเตอร์ Viewer — หนึ่งต่อความสามารถ — ให้เก็บไฟล์คู่หูเหล่านั้นไว้ข้าง ๆ Doconut.Viewer.lic และให้การค้นหาอัตโนมัติดึงขึ้นมา ไม่มีตัวเลือกรายการเส้นทางบน DoconutOptions.

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

เมื่อกระบวนการไม่ได้ทำงานจากโฟลเดอร์โครงการ — เช่น แอปที่เผยแพร่, IIS, คอนเทนเนอร์, หรือโปรแกรมทดสอบ — การตรวจสอบครั้งแรกล้มเหลว, และการตรวจสอบครั้งที่สอง, {AppContext.BaseDirectory}/wwwroot, ต้องค้นหาไฟล์นั้น SDK มีแอปทดสอบของตนเองที่คัดลอกใบอนุญาตไปยังที่นั่นในทุกการสร้างด้วยเป้าหมาย MSBuild นี้:

xml
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
  <ItemGroup>
    <DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
    <StaleOutputLicenses Include="$(OutDir)wwwroot\*.lic" />
  </ItemGroup>
  <!-- ลบก่อน เพื่อให้การเปลี่ยนชื่อหรือการลบไฟล์ .lic ใน wwwroot ก็ทำให้มันออกจากผลลัพธ์ด้วย -->
  <Delete Files="@(StaleOutputLicenses)" />
  <Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)wwwroot" />
</Target>

ตำแหน่งปลายทางต้องเป็น $(OutDir)wwwroot: ไฟล์ .lic ที่คัดลอกไปยังรากของโฟลเดอร์ผลลัพธ์จะไม่ถูกค้นพบโดยการค้นหาอัตโนมัติ ตัวอย่าง LicensePath ในหน้านี้ชี้ไปยังตำแหน่งเดียวกัน

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

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

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

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