DoconutExtensions
רישום שירותים ובינארי
DoconutExtensions (namespace Doconut.Middleware) היא המחלקה הסטטית עם שלוש הקריאות שכל מארח Doconut מבצע: רישום שירות אחד ושתי רישומי בינארי.
builder.Services.AddDoconut(options => { /* … */ });
// …
app.UseDoconutResources(); // לפני UseDoconut()
app.UseDoconut();AddDoconut
IServiceCollection AddDoconut(this IServiceCollection services, Action<DoconutOptions>? configure = null)בונה את DoconutOptions, מאמת אותם באופן fail-fast (ראו DoconutOptions → אימות אתחול), ורושם את גרף השירות המלא:
| שירות | אורך חיים | תפקיד |
|---|---|---|
DoconutOptions | Singleton | אובייקט התצורה |
| Session cache service | Singleton | Token → מטמון סשן (IMemoryCache נרשם גם הוא) |
IDoconutLicenseService | Singleton | רישיון נטען פעם אחת באתחול (עדיפות: LicenseStream → LicenseContent → LicensePath → חיפוש אוטומטי) |
| Page-image pipeline | Singleton | מבצע עיבוד תמונה לדפים (סימן מים, סיבוב, שינוי גודל, הערות) |
| Document security (access store) | Singleton | מאשר קישור token‑ל‑session |
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)מוסיף את תווך ה‑page‑image של 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/..., קריאה זו חסרה או ממוקמת במקום הלא נכון.
זהו ההחלפה הנתמכת לחיבור ידני של תווך טיפול במשאבי‑embedded.
Serving from shared storage
קיימים שני רישומים נוספים לפריסות שבהן הצומת שמייצר מסמך אינו בהכרח הצומת שמשרת את הדפים שלו. שניהם מכוסים מקצה לקצה ב‑Distributed Deployments; החתימות הן:
IServiceCollection AddDoconutDistributedAsyncPublish(...) // תור פרסום רקע עם הצטרפות מרצון
IServiceCollection AddDoconutDistributedWidgets(...) // מאגר משותף לטעינת וידג'טיםצד הקריאה הוא תווך נפרד מחבילת 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(); // נדרש כאשר UnsafeMode = false
app.UseDoconutResources(); // הקריאה הראשונה ל‑Doconut
app.UseDoconut(); // הקריאה השנייה ל‑Doconut (או דרך ענף MapWhen)האם דף זה היה מועיל?