DoconutHost

Gốc cấu trúc cho System.Web

DoconutHost (namespace Doconut) là một lớp tĩnh sở hữu các dịch vụ của Doconut cho toàn bộ tiến trình worker. Các ứng dụng ASP.NET Core xây dựng các dịch vụ đó vào container riêng của framework; ASP.NET classic không có container, vì vậy DoconutHost tạo một container và giữ nó. Trình xử lý DocImage.axd và mô-đun tài nguyên giải quyết mọi thứ chúng cần từ container đó, và mã của bạn cũng vậy.

Thành viênMục đích
static void Initialize(Action<DoconutOptions>? configure = null, Action<IServiceCollection>? configureServices = null)Xây dựng các dịch vụ — một lần
static IServiceProvider Services { get; }Container đã được xây dựng
static bool IsInitialized { get; }true một khi Initialize đã chạy
static void Shutdown()Dừng công việc nền và giải phóng container

Khởi tạo

Gọi nó từ Application_Start trong Global.asax.cs:

csharp
// Global.asax.cs, Application_Start - một lần cho mỗi tiến trình worker. Lần gọi thứ hai là no-op:
// các tùy chọn của lần gọi đầu tiên thắng.
Doconut.DoconutHost.Initialize(
    options =>
    {
        options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
    },
    services =>
    {
        // Tùy chọn. Được chạy sau các đăng ký của Doconut và trước khi container được xây dựng,
        // để nó có thể thêm dịch vụ hoặc thay thế một dịch vụ đã được Doconut đăng ký.
        services.AddMemoryCache();
    });
  • configure nhận DoconutOptions: giấy phép, công tắc bảo mật, plugin, widget.
  • configureServices là tùy chọn. Nó chạy sau khi Doconut đã đăng ký các dịch vụ của mình và trước khi container được xây dựng, vì vậy nó có thể thêm dịch vụ — AddDoconutDistributed cho một web farm là thường dùng — hoặc thay thế một đăng ký mà Doconut đã thực hiện.

Lần gọi đầu tiên thắng. Initialize là idempotent: một lần gọi thứ hai trả về ngay lập tức, và không có delegate nào của nó chạy. Điều này giữ cho một Application_Start trùng lặp không gây hại, nhưng đồng thời có nghĩa là cấu hình không thể thay đổi bằng cách gọi lại Initialize — hãy tái tạo lại application pool.

Một ngoại lệ được ném ở đây — plugin không có giấy phép, tùy chọn không hợp lệ, cấu hình farm không đầy đủ — xảy ra bên trong Application_Start. ASP.NET sau đó trả lời mọi yêu cầu bằng một 500 trống, và ngoại lệ chỉ được ghi lại trong Windows event log (Application log, source ASP.NET).

Dịch vụ và IsInitialized

System.Web không có injection qua constructor cho controllers, pages, hoặc handlers, vì vậy hãy giải quyết các dịch vụ của Doconut ở nơi bạn sử dụng chúng:

csharp
// System.Web không có tiêm constructor: giải quyết các dịch vụ của Doconut ở nơi bạn sử dụng chúng.
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();

// Chỉ được đăng ký khi plugin Converter được (xem trang plugin).
var converter = Doconut.DoconutHost.Services.GetRequiredService<DocumentConverter>();

Services ném InvalidOperationException (DoconutHost.Initialize must be called in Application_Start (Global.asax) before any Doconut request is served.) khi được đọc trước Initialize. Mã có thể chạy sớm hơn — một module, một static constructor — có thể kiểm tra IsInitialized trước.

Những gì mã của bạn thường giải quyết:

Dịch vụThời gian tồn tạiVai trò
ViewerTransientMở, đóng, chú thích, trợ giúp tài nguyên — xem Viewer
DocumentConverterTransientChuyển đổi — chỉ đăng ký với plugin Converter
IDoconutLicenseServiceSingletonGiấy phép đã tải và các khả năng của nó — xem Licensing
DoconutOptionsSingletonCác tùy chọn được truyền tới Initialize
HealthCheckServiceSingletonChạy kiểm tra sức khỏe "doconut" (bên dưới)

Giải quyết từ DoconutHost.Services, không bao giờ từ container của bạn. Đăng ký Doconut vào một container khác tạo ra một bộ dịch vụ thứ hai, tách biệt mà handler và module không bao giờ thấy: các tài liệu mở qua nó không được biết đến bởi DocImage.axd.

Tắt

csharp
// Global.asax.cs, Application_End - dừng công việc nền và giải phóng container.
// An toàn khi gọi hai lần, và an toàn khi Initialize chưa bao giờ chạy.
Doconut.DoconutHost.Shutdown();

Shutdown dừng công việc nền của Doconut (được sử dụng trong chế độ phân tán) và giải phóng container. Việc gọi hai lần là an toàn, và an toàn khi Initialize chưa bao giờ chạy — ví dụ khi application pool được tái tạo trước yêu cầu đầu tiên.

Kiểm tra sức khỏe

Doconut đăng ký một health check có tên "doconut" báo cáo trạng thái giấy phép. ASP.NET classic không có endpoint health-check riêng, vì vậy hãy công khai nó từ một controller:

csharp
// GET /Health - Doconut đăng ký một kiểm tra sức khỏe "doconut" báo cáo trạng thái giấy phép:
// Healthy (hợp lệ), Degraded (dùng thử hoặc không có tệp giấy phép), Unhealthy (hết hạn).
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");
}
Trạng tháiÝ nghĩa
HealthyMột giấy phép hợp lệ đã được tải
DegradedDùng thử, hoặc không tìm thấy file giấy phép
UnhealthyGiấy phép đã hết hạn

Các phương thức mở rộng ASP.NET Core

Gói này cũng chứa UseDoconut() và UseDoconutResources(), các phần mở rộng pipeline của ASP.NET Core, vì nó chia sẻ mã với các gói ASP.NET Core. Trong gói này cả hai đều được đánh dấu [Obsolete] và không được sử dụng: một ứng dụng System.Web không có pipeline yêu cầu để thêm chúng vào. Các thay thế của chúng là hai đăng ký Web.config từ Installation:

ASP.NET Core.NET Framework 4.7.2
builder.Services.AddDoconut(...)DoconutHost.Initialize(...) in Application_Start
app.UseDoconut()Doconut.DocImageHandler on DocImage.axd in Web.config
app.UseDoconutResources()Doconut.DoconutResourceModule in Web.config
Tiêm constructorDoconutHost.Services.GetRequiredService<T>()
Tắt máy hostDoconutHost.Shutdown() in Application_End

Trang này có hữu ích không?