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:

csharp
// 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 במקומות שבהם משתמשים בהם:

csharp
// 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.

כיבוי

csharp
// 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 הקלאסי אין נקודת קצה לבדיקת בריאות משלו, ולכן יש לחשוף זאת ממבקר:

csharp
// 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 injectionDoconutHost.Services.GetRequiredService<T>()
Host shutdownDoconutHost.Shutdown() ב‑Application_End

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