DoconutExtensions
การลงทะเบียนบริการและมิดเดิลแวร์
DoconutExtensions (namespace Doconut.Middleware) เป็นคลาสสเตติกที่มีสามการเรียกใช้ที่โฮสต์ Doconut ทุกตัวทำ: การลงทะเบียนบริการหนึ่งรายการและมิดเดิลแวร์สองรายการ
builder.Services.AddDoconut(options => { /* … */ });
// …
app.UseDoconutResources(); // BEFORE UseDoconut()
app.UseDoconut();AddDoconut
IServiceCollection AddDoconut(this IServiceCollection services, Action<DoconutOptions>? configure = null)สร้าง DoconutOptions ตรวจสอบความถูกต้องแบบ fail-fast (ดู DoconutOptions → การตรวจสอบการเริ่มต้น) และลงทะเบียนกราฟบริการทั้งหมด:
| Service | Lifetime | Role |
|---|---|---|
DoconutOptions | Singleton | วัตถุการกำหนดค่า |
IViewerFactory | Singleton | แมปส่วนขยายเป็นผู้ดูรูปแบบ |
IDocumentSessionManager | Singleton | Token → แคชเซสชัน (IMemoryCache ก็ถูกลงทะเบียนเช่นกัน) |
IDoconutLicenseService | Singleton | ใบอนุญาตโหลดครั้งเดียวที่การเริ่มต้น (ลำดับความสำคัญ: LicenseStream → LicenseContent → LicensePath → การค้นหาอัตโนมัติ) |
PageImageService | Singleton | ไพพ์ไลน์ภาพหน้า (ลายน้ำ/หมุน/สเกล/คำอธิบายภาพ) |
| Document security (access store) | Singleton | การให้สิทธิ์สำหรับการผูก token กับเซสชัน |
Viewer | Transient | ส่วนหน้าสาธารณะสำหรับเปิด/ปิด |
DocumentConverter | Transient | ส่วนหน้าการแปลง — ต้องการปลั๊กอิน Converter |
DistributedDocumentPublisher | — | เผยแพร่ศิลปะของเอกสารไปยังที่เก็บข้อมูลร่วม |
Health check "doconut" | — | รายงานสถานะใบอนุญาต/วันหมดอายุผ่านการตรวจสุขภาพของ ASP.NET |
ไม่มีการเรียกที่เทียบเท่าในไลบรารี .NET Standard ก่อนหน้า มันสร้าง new Viewer(cache, accessor) ต่อคำขอและส่งตัวเลือกไปยังมิดเดิลแวร์; ทั้งสองถูกแทนที่ด้วยการลงทะเบียนเดียวนี้
สองพฤติกรรมที่ควรรู้:
- Converter requires its plugin. การแก้ไข
DocumentConverterโดยไม่ได้เรียกoptions.AddPlugin<ConverterPlugin>()จะทำให้เกิดข้อผิดพลาด:
InvalidOperationException: No IDocumentConverter is registered. Add the converter plugin: options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>().- Plugin entitlement is validated at startup. ใบอนุญาตหายไฟล์
TRIALรุ่นเก่า หรือใบอนุญาตแบบชำระเงินที่ไม่มีความสามารถของปลั๊กอินที่ลงทะเบียน จะล้มเหลวที่เวลาที่เรียกAddDoconut()การลงทะเบียนแบบ Temporary/Demo จะคงอยู่จนกว่าจะถึงวันหมดอายุ ส่วนการตรวจสอบระหว่างรันไทม์จะยกเลิกความสามารถที่หมดอายุ
การตรวจสุขภาพจะรวมกับกลไกมาตรฐานของ ASP.NET Core — ให้แมปหากต้องการสถานะใบอนุญาตบน endpoint สุขภาพของคุณ:
app.MapHealthChecks("/health");UseDoconut
IApplicationBuilder UseDoconut(this IApplicationBuilder app)เพิ่มมิดเดิลแวร์ภาพหน้าของ Doconut มันตอบสนองต่อทุกคำขอที่มีพารามิเตอร์ query ?token= — หน้า, thumbnail, การค้นหา, คำอธิบายภาพ, การกระทำของหน้า (ตารางคำขอเต็มอยู่ใน Core Concepts → How the Viewer Works) เมื่อ UnsafeMode เป็น false ชั้นความปลอดภัยของเอกสารถูกเชื่อมต่อโดยอัตโนมัติก่อนมัน
It takes no arguments. การส่งผ่านอินสแตนซ์ DoconutOptions ที่นี่เป็นรูปแบบของไลบรารีก่อนหน้าและไม่สามารถคอมไพล์ได้อีกต่อไป
ตัวอย่างอ้างอิงกำหนดเส้นทางคำขอของวิดเจ็ตผ่านสาขา path เพื่อรักษารูปแบบคำขอแบบเก่า:
app.MapWhen(
ctx => ctx.Request.Path.Value?.EndsWith("DocImage.axd", StringComparison.OrdinalIgnoreCase) == true,
branch => branch.UseDoconut());UseDoconutResources
IApplicationBuilder UseDoconutResources(this IApplicationBuilder app)ให้บริการไฟล์ JS, CSS, รูปภาพ, และฟอนต์ที่ฝังอยู่ที่ DoconutOptions.ResourcesPath (ค่าเริ่มต้น /doconut-res) ไฟล์เหล่านี้คือไฟล์ที่ Viewer.ReferenceCss() / ReferenceScripts() สร้างแท็กออกมา
Always call it before UseDoconut(). หากพื้นที่ Viewer ว่างเปล่าและคอนโซลของเบราว์เซอร์แสดง 404 สำหรับ /doconut-res/... แสดงว่าการเรียกนี้หายไปหรือวางตำแหน่งผิด
นี่คือวิธีแทนที่ที่สนับสนุนสำหรับการเชื่อมต่อมิดเดิลแวร์ทรัพยากรฝังด้วยมือโดยใช้ app.UseMiddleware<EmbeddedResourceMiddleware>()
Serving from shared storage
มีการลงทะเบียนเพิ่มเติมสองรายการสำหรับการปรับใช้ที่โหนดที่เรนเดอร์เอกสารไม่จำเป็นต้องเป็นโหนดที่ให้บริการหน้าของมัน ทั้งสองถูกครอบคลุมตั้งแต่ต้นจนจบใน การปรับใช้แบบกระจาย ; ลายเซ็นคือ:
IServiceCollection AddDoconutDistributedAsyncPublish(...) // opt-in background publish queue
IServiceCollection AddDoconutDistributedWidgets(...) // shared backing store for widget uploadsด้านการอ่านเป็นมิดเดิลแวร์แยกจากแพคเกจ Doconut.Clouds:
IApplicationBuilder UseDoconutCloud<THandler>(
this IApplicationBuilder app,
Action<CloudOptions>? configure = null,
string pathPrefix = "/doconut-cloud")
where THandler : BaseCloudHandlerUseDoconutWebFarm(...) และ WebFarmOptions ไม่มีในรุ่นนี้ ดูที่ คู่มือการย้าย เพื่อดูการแมปตั้งค่า‑ต่อตั้งค่า
Ordering recap
app.UseRouting();
app.UseSession(); // required when UnsafeMode = false
app.UseDoconutResources(); // 1st Doconut call
app.UseDoconut(); // 2nd Doconut call (or via a MapWhen branch)หน้านี้เป็นประโยชน์หรือไม่?