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()バックグラウンド作業を停止し、コンテナを破棄します

初期化

Global.asax.cs の中の Application_Start から呼び出します:

csharp
// Global.asax.cs, Application_Start - ワーカープロセスごとに一度だけ。2回目の呼び出しは何もしません:
// 最初の呼び出しのオプションが優先されます。
Doconut.DoconutHost.Initialize(
    options =>
    {
        options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
    },
    services =>
    {
        // 任意です。Doconut の独自登録の後、コンテナが構築される前に実行されます、
        // そのため、サービスを追加したり、Doconut が登録したものを置き換えることができます。
        services.AddMemoryCache();
    });
  • configure は DoconutOptions を受け取ります:ライセンス、セキュリティスイッチ、プラグイン、ウィジェット。
  • configureServices はオプションです。Doconut が独自のサービスを登録した後、コンテナが構築される前に実行されるため、サービスを追加できます — Web ファーム向けの AddDoconutDistributed が一般的です — または Doconut が行った登録を置き換えることができます。

最初の呼び出しが有効です。 Initialize は冪等です:2 回目の呼び出しはすぐに戻り、そのデリゲートは実行されません。これにより重複した 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 は、Initialize の前に読み取られた場合、InvalidOperationException(DoconutHost.Initialize must be called in Application_Start (Global.asax) before any Doconut request is served.)をスローします。より早く実行される可能性のあるコード — モジュールや静的コンストラクタ — は、まず IsInitialized をチェックできます。

コードが通常解決するものは次のとおりです:

サービスライフタイム役割
ViewerTransient開く、閉じる、注釈、リソースヘルパー — Viewer を参照
DocumentConverterTransient変換 — Converter プラグインでのみ登録
IDoconutLicenseServiceSingleton読み込まれたライセンスとその機能 — Licensing を参照
DoconutOptionsSingletonInitialize に渡されたオプション
HealthCheckServiceSingleton以下の "doconut" ヘルスチェックを実行

DoconutHost.Services から解決し、独自のコンテナからは決して解決しないでください。Doconut を別のコンテナに登録すると、ハンドラやモジュールが参照しない第二の独立したサービスセットが構築されます:それを通じて開かれたドキュメントは DocImage.axd からは認識されません。

シャットダウン

csharp
// Global.asax.cs, Application_End - バックグラウンド作業を停止し、コンテナを破棄します。
// 2回呼び出しても安全で、Initialize が実行されていなくても安全です。
Doconut.DoconutHost.Shutdown();

Shutdown は Doconut のバックグラウンド作業(分散モードで使用)を停止し、コンテナを破棄します。2 回呼び出しても安全で、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 内で

このページは役に立ちましたか?