ライセンス設定

Doconut がライセンスファイルを探す場所

ライセンスがない場合でも、Doconut はドキュメントをレンダリングしますが、すべてのページに評価用の透かしが表示されます。このページでは、ライセンスを提供する4つの方法と、複数が設定された場合の正確な優先順位を説明します。

ライセンスを提供する4つの方法

DoconutOptions には、ストリーム、コンテンツ、ファイルパスという3つの明示的なソースがあり、いずれも設定されていない場合は自動検出が行われます。複数が設定された場合の優先順位は次のとおりです。

LicenseStreamLicenseContent を、LicenseContentLicensePath を、LicensePath が auto-search を上回ります。

パスで指定する場合

LicensePath はそのまま File.Exists に渡されます。相対パスはプロセスの 現在の作業ディレクトリ を基準に解決されます。プロジェクトフォルダーや Program.cs があるフォルダーではありません。パスが解決できない場合、Doconut は例外をスローせず、auto-search にフォールバックもしません。単にライセンスがロードされず、ビューアに透かしが表示されます。auto-search は LicensePathLicenseContentLicenseStream のいずれも設定されていないときだけ実行されます。

絶対パス(例: IWebHostEnvironment.WebRootPathAppContext.BaseDirectory から構築)を使用するか、LicensePath を省略して下記の自動検出に任せてください。

csharp
builder.Services.AddDoconut(options =>
{
    options.LicensePath = Path.Combine(AppContext.BaseDirectory, "Doconut.Viewer.lic");
});

ストリームで指定する場合

LicenseStream は起動時に一度だけ読み取られます。ライセンスがディスク上のファイルではなくシークレットストアから取得される場合に便利です。

csharp
// Precedence: LicenseStream > LicenseContent > LicensePath > auto-search.
builder.Services.AddDoconut(options =>
{
    options.LicenseStream = licenseStream;
});

コンテンツで指定する場合

LicenseContent にはライセンス文字列そのものを設定します。環境変数、データベース、シークレットマネージャーなどから取得できます。

csharp
// License XML from a database, environment variable, or secret manager —
// no file on disk. Beaten only by LicenseStream.
builder.Services.AddDoconut(options =>
{
    options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});

自動検出

3つの明示的なソースをすべて設定しないと、Doconut が自らライセンスを検索します。

csharp
// Configure nothing, and Doconut searches for the license itself:
//   1. {CurrentDirectory}/wwwroot
//   2. {CurrentDirectory}/wwwroot/lib
//   3. AppContext.BaseDirectory  (the build output folder)
// It looks for Doconut.Viewer.lic plus any per-plugin
// Doconut.Viewer.<Capability>.lic files alongside it.
builder.Services.AddDoconut();

検索対象ディレクトリ(順序)と各ディレクトリで探すファイル名は以下の通りです。

text
1. {CurrentDirectory}/wwwroot
2. {CurrentDirectory}/wwwroot/lib
3. AppContext.BaseDirectory

Filenames (checked in each directory above, in order):
  Doconut.Viewer.lic                   — base viewer license
  Doconut.Viewer.<Capability>.lic      — per-plugin license, alongside Doconut.Viewer.lic

ライセンスを出力フォルダーにコピーする方法

LicensePath と auto-search の AppContext.BaseDirectory の検索は、ビルドされたアプリの隣に .lic ファイルが存在することを前提としています。ソースの wwwroot にだけ置いていては動作しません。SDK のテストアプリはビルドごとに次の MSBuild ターゲットでコピーします。

xml
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
  <ItemGroup>
    <DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
  </ItemGroup>
  <Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
</Target>

.lic ファイルはソース管理に入れず、アプリと同じ場所にデプロイするか、シークレットストアから LicenseContent または LicenseStream で注入してください。

ライセンスがない場合の挙動

ライセンスが見つからなくても例外はスローされません。AddDoconut() は成功し、アプリは起動しますが、すべてのページに評価用透かしが表示され、オプション機能は付与されません。

見つかったライセンスが却下された場合は別です。署名不正、改ざん、ブラックリスト、またはライセンスの有効期間外などが原因で OpenDocumentAsyncLicenseExceptionLicense.RejectionMessage を伴ってスローされます。カレンダー期限が切れたライセンスで拒否メッセージが無い場合は、透かしモードのまま継続します。

プラグインは機能権限が必要

権限が付与されていないプラグインを登録すると、ライセンスが無い場合や TRIAL ファイル、該当権限がない有料ライセンスの場合、AddDoconut()InvalidOperationException をスローし、アプリは起動しません。例として、Converter 権限が付与されていない状態でコンバータプラグインを登録した場合は次のようになります。

text
InvalidOperationException: The Converter plugin is registered via AddPlugin but no active
license grants Converter. Remove the AddPlugin<...>() call or install a license (or
trial/demo) that includes Converter.

メッセージは直接的な対処法を示しています。該当プラグインの options.AddPlugin<...>() 呼び出しを削除するか、Converter 権限を含む有料ライセンスまたは一時的な Temporary/Demo (NFR) ライセンスをインストールしてください。一時的な登録は有効期限が切れた後も残りますが、期限切れ後は機能が無効化され、再起動時にクラッシュせずに動作を劣化させます。

読み込まれたライセンスを検証する方法

SDK と同じ真実の情報源である IDoconutLicenseService を使用して、認証済み診断エンドポイントを公開したり、機能フラグを制御したりできます。ライセンスの内容やキーを返さないようにしてください。

csharp
app.MapGet("/api/doconut/license", (IDoconutLicenseService license) => Results.Ok(new
{
    viewer = license.IsViewerLicensed || license.IsTemporary,
    temporary = license.IsTemporary,
    search = license.IsCapabilityGranted(LicenseCapability.Search),
    annotation = license.IsCapabilityGranted(LicenseCapability.Annotation),
    converter = license.HasConverter,
    dicom = license.HasDicom
}));

ライセンスは AddDoconut() の登録時に読み込まれます。ResetLicense は現在互換性のためのプロパティで、アクティブなリロードパスはありません。そのため、ライセンスファイルを差し替える場合はアプリケーションを再起動する必要があります。

トラブルシューティングマトリックス

症状考えられる原因確認項目
ビューアは動作するがすべてのページに透かしが表示されるライセンスがロードされていない、またはカレンダー期限切れIDoconutLicenseService を解決し、出力ディレクトリとプロセスの作業ディレクトリを確認
プラグインで AddDoconut() が例外をスローするライセンスがそのプラグイン権限を付与していないIsCapabilityGranted(...) を確認し、購入していないプラグインの登録を削除
ローカルでは相対パスが機能するが IIS/コンテナでは機能しないプロセスの作業ディレクトリが変わっているAppContext.BaseDirectory または絶対パスを使用
置き換えた .lic ファイルが反映されないシングルトンのライセンスサービスがすでに生成されているアプリケーションを再起動
OpenDocumentAsyncLicenseException をスローする署名、ドメイン、バージョンウィンドウ、ブラックリスト、またはプラグイン実行時のゲートがライセンスを拒否した例外・拒否メッセージを読み取り、信頼できないクライアントに公開しない

次のステップ

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