DoconutExtensions

רישום שירותים וביניים

DoconutExtensions (namespace Doconut.Middleware) היא המחלקה הסטטית עם שלוש הקריאות שכל מארח Doconut מבצע: רישום שירות אחד ושתי קריאות ביניים.

csharp
builder.Services.AddDoconut(options => { /* … */ });
// …
app.UseDoconutResources(); // BEFORE UseDoconut()
app.UseDoconut();

AddDoconut

text
IServiceCollection AddDoconut(this IServiceCollection services, Action<DoconutOptions>? configure = null)

בונה את DoconutOptions, מאמת אותם באופן מהיר (ראו DoconutOptions → אימות בזמן האתחול), ורושם את גרף השירותים המלא:

ServiceLifetimeRole
DoconutOptionsSingletonאובייקט הקונפיגורציה
IViewerFactorySingletonממפה הרחבות לצפיות בפורמט
IDocumentSessionManagerSingletonToken → מטמון סשן (IMemoryCache נרשם גם הוא)
IDoconutLicenseServiceSingletonרישיון נטען פעם אחת באתחול (קדימות: LicenseStreamLicenseContentLicensePath → חיפוש אוטומטי)
PageImageServiceSingletonצינור תמונת דף (סימן מים/סיבוב/קנה מידה/הערות)
Document security (access store)Singletonמעניקים לקישור בין טוקן לסשן
ViewerTransientהממשק הציבורי לפתיחה/סגירה
DocumentConverterTransientממשק המרה — דורש את תוסף Converter
DistributedDocumentPublisherמפרסם את תוצרי המסמך לאחסון משותף
Health check "doconut"מדווח על מצב הרישיון/תפוגה דרך בדיקות בריאות של ASP.NET

אין קריאה מקבילה בספרייה הקודמת של .NET Standard. היא יצרה new Viewer(cache, accessor) לכל בקשה והעבירה אפשרויות לביניים; שניהם הוחלפו ברישום זה.

שני התנהגויות שכדאי לדעת:

  • Converter דורש את התוסף שלו. ניסיון לפתור DocumentConverter ללא options.AddPlugin<ConverterPlugin>() יגרום ל‑:
text
InvalidOperationException: No IDocumentConverter is registered. Add the converter plugin: options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>().
  • זכאות לתוסף נבדקת באתחול. חוסר רישיון, קובץ TRIAL מיושן, או רישיון בתשלום ללא תוסף רשום גורמים לכשל ב‑AddDoconut() . רישומים זמניים/דמו נשארים פעילים אחרי תאריך התפוגה, בעוד שערי זמן ריצה מבטלים את היכולות שפג תוקפן.

בדיקת הבריאות משולבת במנגנון ה‑ASP.NET Core הסטנדרטי — מפתו אם ברצונך לקבל את מצב הרישיון בנקודת הבריאות שלך:

csharp
app.MapHealthChecks("/health");

UseDoconut

text
IApplicationBuilder UseDoconut(this IApplicationBuilder app)

מוסיף את ביניים תמונת הדף של Doconut. הוא מטפל בכל בקשה שנושאת פרמטר שאילתה ?token= — דפים, תמונות ממוזערות, חיפוש, הערות, פעולות דף (טבלת הבקשות המלאה נמצאת ב‑Core Concepts → How the Viewer Works). כאשר UnsafeMode הוא false, שכבת אבטחת המסמך מחוברת אוטומטית לפניו.

הקריאה אינה מקבלת פרמטרים. העברת מופע DoconutOptions כאן הייתה הצורה של הספרייה הקודמת וכעת אינה מתקמפלת.

דוגמת ההפניה מריצה את בקשות הווידג'ט דרך ענף נתיב, תוך שמירה על צורת הבקשה ההיסטורית:

csharp
app.MapWhen(
    ctx => ctx.Request.Path.Value?.EndsWith("DocImage.axd", StringComparison.OrdinalIgnoreCase) == true,
    branch => branch.UseDoconut());

UseDoconutResources

text
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

שתי רישומים נוספים קיימים לפריסות שבהן המחשב שמרנדר מסמך אינו בהכרח המחשב שמשרת את הדפים שלו. שניהם מכוסים מקצה לקצה ב‑פריסות מבוזרות; החתימות הן:

text
IServiceCollection AddDoconutDistributedAsyncPublish(...)   // opt-in background publish queue
IServiceCollection AddDoconutDistributedWidgets(...)        // shared backing store for widget uploads

צד הקריאה הוא ביניים נפרד מהחבילה Doconut.Clouds:

text
IApplicationBuilder UseDoconutCloud<THandler>(
    this IApplicationBuilder app,
    Action<CloudOptions>? configure = null,
    string pathPrefix = "/doconut-cloud")
    where THandler : BaseCloudHandler

UseDoconutWebFarm(...) ו‑WebFarmOptions אינם קיימים בגרסה זו. ראו את מדריך ההגירה למיפוי הגדרה‑בהגדרה.

Ordering recap

csharp
app.UseRouting();
app.UseSession();          // required when UnsafeMode = false
app.UseDoconutResources(); // 1st Doconut call
app.UseDoconut();          // 2nd Doconut call (or via a MapWhen branch)

האם דף זה היה מועיל?