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ên | Mụ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:
// 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();
});configurenhận DoconutOptions: giấy phép, công tắc bảo mật, plugin, widget.configureServiceslà 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ụ —AddDoconutDistributedcho 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:
// 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ại | Vai trò |
|---|---|---|
Viewer | Transient | Mở, đóng, chú thích, trợ giúp tài nguyên — xem Viewer |
DocumentConverter | Transient | Chuyển đổi — chỉ đăng ký với plugin Converter |
IDoconutLicenseService | Singleton | Giấy phép đã tải và các khả năng của nó — xem Licensing |
DoconutOptions | Singleton | Các tùy chọn được truyền tới Initialize |
HealthCheckService | Singleton | Chạ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
// 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:
// 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 |
|---|---|
Healthy | Một giấy phép hợp lệ đã được tải |
Degraded | Dùng thử, hoặc không tìm thấy file giấy phép |
Unhealthy | Giấ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 constructor | DoconutHost.Services.GetRequiredService<T>() |
| Tắt máy host | DoconutHost.Shutdown() in Application_End |
Trang này có hữu ích không?