DoconutHost
System.Web 的组合根
DoconutHost(命名空间 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 - 每个工作进程只调用一次。第二次调用不执行任何操作:
// 第一次调用的选项获胜。
Doconut.DoconutHost.Initialize(
options =>
{
options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
},
services =>
{
// 可选。运行在 Doconut 的自身注册之后、容器构建之前,
// 因此它可以添加服务或替换 Doconut 注册的某个服务。
services.AddMemoryCache();
});configure接收 DoconutOptions:许可证、安全开关、插件、部件。configureServices为可选项。它在 Doconut 注册自身服务之后、容器构建之前运行,因此可以添加服务——AddDoconutDistributed用于 Web 农场是常见的做法——或替换 Doconut 已注册的服务。
第一次调用生效。 Initialize 是幂等的:第二次调用会立即返回,且 其委托均不会执行。这使得重复的 Application_Start 不会产生影响,但也意味着无法通过再次调用 Initialize 来更改配置——请回收应用程序池。
此处抛出的异常——插件未授权、选项无效、农场配置不完整——会在 Application_Start 内部产生。ASP.NET 随后会对每个请求返回空的 500,并且异常仅记录在 Windows 事件日志(应用程序日志,来源 ASP.NET)中。
服务和 IsInitialized
System.Web 没有对控制器、页面或处理程序的构造函数注入,因此请在使用位置解析 Doconut 的服务:
// System.Web 不支持构造函数注入:在使用的地方解析 Doconut 服务。
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
// 仅在 Converter 插件启用时注册(参见插件页面)。
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 - 停止后台工作并释放容器。
// 安全地调用两次,即使 Initialize 从未运行也安全。
Doconut.DoconutHost.Shutdown();Shutdown 停止 Doconut 的后台工作(用于分布式模式)并释放容器。该方法可以安全调用两次,即使 Initialize 从未运行——例如在首次请求之前应用程序池已回收。
健康检查
Doconut 注册了名为 "doconut" 的健康检查,用于报告许可证状态。经典 ASP.NET 没有自己的健康检查端点,因此需要在控制器中公开它:
// GET /Health - Doconut 注册了一个 "doconut" 健康检查,报告许可证状态:
// 健康(有效),降级(试用或无许可证文件),不健康(已过期)。
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 应用没有请求管道可供添加它们。它们的替代方案是来自 Installation 的两个 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 中 |
| 构造函数注入 | DoconutHost.Services.GetRequiredService<T>() |
| 主机关闭 | DoconutHost.Shutdown() 在 Application_End 中 |
此页面对您有帮助吗?