ライセンス設定
Doconut がライセンスファイルを探す場所
ライセンスがない場合でも、Doconut はドキュメントをレンダリングしますが、すべてのページに評価用の透かしが表示されます。このページでは、ライセンスを提供する4つの方法と、複数が設定された場合の正確な優先順位を説明します。
ライセンスを提供する4つの方法
DoconutOptions には、ストリーム、コンテンツ、ファイルパスという3つの明示的なソースがあり、いずれも設定されていない場合は自動検出が行われます。複数が設定された場合の優先順位は次のとおりです。
LicenseStream が LicenseContent を、LicenseContent が LicensePath を、LicensePath が auto-search を上回ります。
パスで指定する場合
LicensePath はそのまま File.Exists に渡されます。相対パスはプロセスの 現在の作業ディレクトリ を基準に解決されます。プロジェクトフォルダーや Program.cs があるフォルダーではありません。パスが解決できない場合、Doconut は例外をスローせず、auto-search にフォールバックもしません。単にライセンスがロードされず、ビューアに透かしが表示されます。auto-search は LicensePath、LicenseContent、LicenseStream のいずれも設定されていないときだけ実行されます。
絶対パス(例: IWebHostEnvironment.WebRootPath や AppContext.BaseDirectory から構築)を使用するか、LicensePath を省略して下記の自動検出に任せてください。
builder.Services.AddDoconut(options =>
{
options.LicensePath = Path.Combine(AppContext.BaseDirectory, "Doconut.Viewer.lic");
});ストリームで指定する場合
LicenseStream は起動時に一度だけ読み取られます。ライセンスがディスク上のファイルではなくシークレットストアから取得される場合に便利です。
// Precedence: LicenseStream > LicenseContent > LicensePath > auto-search.
builder.Services.AddDoconut(options =>
{
options.LicenseStream = licenseStream;
});コンテンツで指定する場合
LicenseContent にはライセンス文字列そのものを設定します。環境変数、データベース、シークレットマネージャーなどから取得できます。
// 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 が自らライセンスを検索します。
// 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();検索対象ディレクトリ(順序)と各ディレクトリで探すファイル名は以下の通りです。
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 ターゲットでコピーします。
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
<ItemGroup>
<DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
</ItemGroup>
<Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
</Target>
.licファイルはソース管理に入れず、アプリと同じ場所にデプロイするか、シークレットストアからLicenseContentまたはLicenseStreamで注入してください。
ライセンスがない場合の挙動
ライセンスが見つからなくても例外はスローされません。AddDoconut() は成功し、アプリは起動しますが、すべてのページに評価用透かしが表示され、オプション機能は付与されません。
見つかったライセンスが却下された場合は別です。署名不正、改ざん、ブラックリスト、またはライセンスの有効期間外などが原因で OpenDocumentAsync は LicenseException と License.RejectionMessage を伴ってスローされます。カレンダー期限が切れたライセンスで拒否メッセージが無い場合は、透かしモードのまま継続します。
プラグインは機能権限が必要
権限が付与されていないプラグインを登録すると、ライセンスが無い場合や TRIAL ファイル、該当権限がない有料ライセンスの場合、AddDoconut() は InvalidOperationException をスローし、アプリは起動しません。例として、Converter 権限が付与されていない状態でコンバータプラグインを登録した場合は次のようになります。
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 を使用して、認証済み診断エンドポイントを公開したり、機能フラグを制御したりできます。ライセンスの内容やキーを返さないようにしてください。
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 ファイルが反映されない | シングルトンのライセンスサービスがすでに生成されている | アプリケーションを再起動 |
OpenDocumentAsync が LicenseException をスローする | 署名、ドメイン、バージョンウィンドウ、ブラックリスト、またはプラグイン実行時のゲートがライセンスを拒否した | 例外・拒否メッセージを読み取り、信頼できないクライアントに公開しない |
次のステップ
- ライセンス — 機能、ライセンス階層、実行時にロードされた内容の検証方法。
- トラブルシューティング — 透かし、拒否されたライセンス、権限エラーの対処方法。
このページは役に立ちましたか?