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 调用:

csharp
// 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 的服务:

csharp
// 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 来说是未知的。

关闭

csharp
// Global.asax.cs,Application_End - 停止后台工作并释放容器。
// 安全地调用两次,即使 Initialize 从未运行也安全。
Doconut.DoconutHost.Shutdown();

Shutdown 停止 Doconut 的后台工作(用于分布式模式)并释放容器。该方法可以安全调用两次,即使 Initialize 从未运行——例如在首次请求之前应用程序池已回收。

健康检查

Doconut 注册了名为 "doconut" 的健康检查,用于报告许可证状态。经典 ASP.NET 没有自己的健康检查端点,因此需要在控制器中公开它:

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

此页面对您有帮助吗?