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, מאמת אותם באופן מהיר (ראו DoconutOptions → אימות בזמן האתחול), ורושם את גרף השירותים המלא:
| Service | Lifetime | Role |
|---|---|---|
DoconutOptions | Singleton | אובייקט הקונפיגורציה |
IViewerFactory | Singleton | ממפה הרחבות לצפיות בפורמט |
IDocumentSessionManager | Singleton | Token → מטמון סשן (IMemoryCache נרשם גם הוא) |
IDoconutLicenseService | Singleton | רישיון נטען פעם אחת באתחול (קדימות: LicenseStream → LicenseContent → LicensePath → חיפוש אוטומטי) |
PageImageService | Singleton | צינור תמונת דף (סימן מים/סיבוב/קנה מידה/הערות) |
| Document security (access store) | Singleton | מעניקים לקישור בין טוקן לסשן |
Viewer | Transient | הממשק הציבורי לפתיחה/סגירה |
DocumentConverter | Transient | ממשק המרה — דורש את תוסף Converter |
DistributedDocumentPublisher | — | מפרסם את תוצרי המסמך לאחסון משותף |
Health check "doconut" | — | מדווח על מצב הרישיון/תפוגה דרך בדיקות בריאות של ASP.NET |
אין קריאה מקבילה בספרייה הקודמת של .NET Standard. היא יצרה
new Viewer(cache, accessor) לכל בקשה והעבירה אפשרויות לביניים; שניהם הוחלפו ברישום זה.
שני התנהגויות שכדאי לדעת:
- Converter דורש את התוסף שלו. ניסיון לפתור
DocumentConverterללאoptions.AddPlugin<ConverterPlugin>()יגרום ל‑:
InvalidOperationException: No IDocumentConverter is registered. Add the converter plugin: options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>().- זכאות לתוסף נבדקת באתחול. חוסר רישיון, קובץ
TRIALמיושן, או רישיון בתשלום ללא תוסף רשום גורמים לכשל ב‑AddDoconut(). רישומים זמניים/דמו נשארים פעילים אחרי תאריך התפוגה, בעוד שערי זמן ריצה מבטלים את היכולות שפג תוקפן.
בדיקת הבריאות משולבת במנגנון ה‑ASP.NET Core הסטנדרטי — מפתו אם ברצונך לקבל את מצב הרישיון בנקודת הבריאות שלך:
app.MapHealthChecks("/health");UseDoconut
IApplicationBuilder UseDoconut(this IApplicationBuilder app)מוסיף את ביניים תמונת הדף של Doconut. הוא מטפל בכל בקשה שנושאת פרמטר שאילתה ?token= — דפים, תמונות ממוזערות, חיפוש, הערות, פעולות דף (טבלת הבקשות המלאה נמצאת ב‑Core Concepts → How the Viewer Works). כאשר UnsafeMode הוא false, שכבת אבטחת המסמך מחוברת אוטומטית לפניו.
הקריאה אינה מקבלת פרמטרים. העברת מופע DoconutOptions כאן הייתה הצורה של הספרייה הקודמת וכעת אינה מתקמפלת.
דוגמת ההפניה מריצה את בקשות הווידג'ט דרך ענף נתיב, תוך שמירה על צורת הבקשה ההיסטורית:
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() מפיקים תגיות עבורם.
תמיד יש לקרוא לפני UseDoconut(). אם אזור הצופה נשאר ריק וקונסול הדפדפן מציג 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)האם דף זה היה מועיל?