DoconutExtensions

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

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

csharp
builder.Services.AddDoconut(options => { /* … */ });
// …
app.UseDoconutResources(); // לפני UseDoconut()
app.UseDoconut();

AddDoconut

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

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

שירותאורך חייםתפקיד
DoconutOptionsSingletonאובייקט התצורה
Session cache serviceSingletonToken → מטמון סשן (IMemoryCache נרשם גם הוא)
IDoconutLicenseServiceSingletonרישיון נטען פעם אחת באתחול (עדיפות: LicenseStream → LicenseContent → LicensePath → חיפוש אוטומטי)
Page-image pipelineSingletonמבצע עיבוד תמונה לדפים (סימן מים, סיבוב, שינוי גודל, הערות)
Document security (access store)Singletonמאשר קישור token‑ל‑session
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)

מוסיף את תווך ה‑page‑image של 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/..., קריאה זו חסרה או ממוקמת במקום הלא נכון.

זהו ההחלפה הנתמכת לחיבור ידני של תווך טיפול במשאבי‑embedded.

Serving from shared storage

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

text
IServiceCollection AddDoconutDistributedAsyncPublish(...)   // תור פרסום רקע עם הצטרפות מרצון
IServiceCollection AddDoconutDistributedWidgets(...)        // מאגר משותף לטעינת וידג'טים

צד הקריאה הוא תווך נפרד מחבילת 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();          // נדרש כאשר UnsafeMode = false
app.UseDoconutResources(); // הקריאה הראשונה ל‑Doconut
app.UseDoconut();          // הקריאה השנייה ל‑Doconut (או דרך ענף MapWhen)

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