DoconutHost
שורש הרכבה עבור System.Web
DoconutHost (namespace Doconut) הוא מחלקה סטטית שמחזיקה את השירותים של Doconut לכל תהליך העובד. אפליקציות ASP.NET Core בונות את השירותים האלה לתוך המכולה של המסגרת עצמה; ב‑ASP.NET הקלאסי אין מכולה, ולכן DoconutHost בונה אחת ושומרת עליה. המטפל DocImage.axd והמודול המשאב פותרים את כל מה שהם צריכים ממנה, וכך גם הקוד שלך.
| חבר | מטרה |
|---|---|
static void Initialize(Action<DoconutOptions>? configure = null, Action<IServiceCollection>? configureServices = null) | בונה את השירותים — פעם אחת |
static IServiceProvider Services { get; } | המכולה שנבנתה |
static bool IsInitialized { get; } | true ברגע ש‑Initialize רץ |
static void Shutdown() | עוצר עבודה ברקע ומשחרר את המכולה |
אתחול
קרא זאת מתוך Application_Start ב‑Global.asax.cs:
// Global.asax.cs, Application_Start - once per worker process. A second call is a no-op:
// the first call's options win.
Doconut.DoconutHost.Initialize(
options =>
{
options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
},
services =>
{
// Optional. Runs after Doconut's own registrations and before the container is built,
// so it can add services or replace one Doconut registered.
services.AddMemoryCache();
});configureמקבל את ה‑DoconutOptions: רישיון, מתגים של אבטחה, תוספים, וידג'טים.configureServicesהוא אופציונלי. הוא רץ אחרי ש‑Doconut רשם את השירותים שלו ולפני שהמכולה נבנית, ולכן ניתן להוסיף שירותים —AddDoconutDistributedעבור חוות אינטרנט הוא השימוש הרגיל — או להחליף רישום ש‑Doconut ביצע.
הקריאה הראשונה מנצחת. Initialize הוא אידמפוטנטי: קריאה שנייה מחזירה מיידית, ו‑אף אחד מהדלים שלו לא רץ. זה משאיר Application_Start משוכפל ללא נזק, אך גם אומר שלא ניתן לשנות את ההגדרות על‑ידי קריאה חוזרת ל‑Initialize — יש למחזר את בריכת האפליקציה במקום זאת.
חריגה שמתרחשת כאן — תוסף ללא רישיון, אפשרויות שגויות, תצורת חווה לא מלאה — מתרחשת בתוך Application_Start. ASP.NET לאחר מכן מחזיר לכל בקשה 500 ריק, והחריגה נרשמת רק ביומן האירועים של Windows (יומן יישומים, מקור ASP.NET).
שירותים ו‑IsInitialized
ל‑System.Web אין הזרקת קונסטרוקטור עבור בקרים, דפים או מטפלים, ולכן יש לפתור את שירותי Doconut במקומות שבהם משתמשים בהם:
// System.Web has no constructor injection: resolve Doconut services where you use them.
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
// Registered only when the Converter plugin is (see the plugin page).
var converter = Doconut.DoconutHost.Services.GetRequiredService<DocumentConverter>();Services זורק InvalidOperationException (DoconutHost.Initialize must be called in Application_Start (Global.asax) before any Doconut request is served.) כאשר קוראים לו לפני Initialize. קוד שיכול לרוץ מוקדם יותר — מודול, קונסטרוקטור סטטי — יכול לבדוק קודם את IsInitialized.
מה הקוד שלך בדרך כלל פותר:
| שירות | משך חיים | תפקיד |
|---|---|---|
Viewer | זמני | פתיחה, סגירה, אנוטציות, עזרי משאבים — ראה Viewer |
DocumentConverter | זמני | המרה — נרשם רק עם תוסף ה‑Converter |
IDoconutLicenseService | יחיד | הרישיון הטעון והיכולות שלו — ראה Licensing |
DoconutOptions | יחיד | האפשרויות שהועברו ל‑Initialize |
HealthCheckService | יחיד | מריץ את בדיקת הבריאות "doconut" (להלן) |
פתור דרך DoconutHost.Services, לעולם לא ממכולה שלך. רישום Doconut במכולה אחרת יוצר סט שירותים שני ונפרד שהמטפל והמודול לעולם לא יראו: מסמכים שנפתחים דרכה אינם מוכרים ל‑DocImage.axd.
כיבוי
// Global.asax.cs, Application_End - stops background work and disposes the container.
// Safe to call twice, and safe when Initialize never ran.
Doconut.DoconutHost.Shutdown();Shutdown עוצר את העבודה ברקע של Doconut (בשימוש במצב המבוזר) ומשחרר את המכולה. ניתן לקרוא לו פעמיים בבטחה, וגם כאשר Initialize מעולם לא רץ — לדוגמה כאשר בריכת האפליקציה מתמחזרת לפני הבקשה הראשונה.
בדיקת בריאות
Doconut רושם בדיקת בריאות בשם "doconut" שמדווחת על מצב הרישיון. ל‑ASP.NET הקלאסי אין נקודת קצה לבדיקת בריאות משלו, ולכן יש לחשוף זאת ממבקר:
// GET /Health - Doconut registers a "doconut" health check that reports the license state:
// Healthy (valid), Degraded (trial or no license file), Unhealthy (expired).
public async Task<ActionResult> Index()
{
var health = Doconut.DoconutHost.Services.GetRequiredService<HealthCheckService>();
HealthReport report = await health.CheckHealthAsync();
Response.StatusCode = report.Status == HealthStatus.Unhealthy ? 503 : 200;
return Content(report.Status.ToString(), "text/plain");
}| סטטוס | משמעות |
|---|---|
Healthy | רישיון תקף נטען |
Degraded | גרסת ניסיון, או שלא נמצא קובץ רישיון |
Unhealthy | הרישיון פג תוקף |
שיטות ההרחבה של ASP.NET Core
החבילה מכילה גם UseDoconut() ו‑UseDoconutResources(), הרחבות צינור העבודה של ASP.NET Core, מכיוון שהיא חולקת קוד עם חבילות ASP.NET Core. בחבילה זו שני המתודות מסומנות [Obsolete] ואינן משמשות: ליישום System.Web אין צינור בקשות להוסיף אותם אליו. החלופות שלהן הן שני הרישומים ב‑Web.config מתוך התקנה:
| ASP.NET Core | .NET Framework 4.7.2 |
|---|---|
builder.Services.AddDoconut(...) | DoconutHost.Initialize(...) ב‑Application_Start |
app.UseDoconut() | Doconut.DocImageHandler על DocImage.axd ב‑Web.config |
app.UseDoconutResources() | Doconut.DoconutResourceModule ב‑Web.config |
| Constructor injection | DoconutHost.Services.GetRequiredService<T>() |
| Host shutdown | DoconutHost.Shutdown() ב‑Application_End |
האם דף זה היה מועיל?