ライセンス設定
Doconut がライセンスファイルを探す場所
ライセンスがない場合でも、Doconut はドキュメントをレンダリングします — 各ページには評価用の透かしが表示されます。このページでは、ライセンスを提供する4つの方法と、複数設定された場合の正確な優先順位について説明します。
Four ways to supply a license
ライセンスを提供する方法は4つあります:DoconutOptions の3つの明示的なソース(ストリーム、RAW コンテンツ、ファイルパス)と、いずれも設定されていない場合の自動検出です。複数が設定されている場合、優先順位は以下の通りです:
LicenseStream が LicenseContent を上回り、LicenseContent が LicensePath を上回り、LicensePath が auto-search を上回ります。
パスで指定
LicensePath はそのまま File.Exists に渡されます。相対パスはプロセスの カレントワーキングディレクトリ を基準に解決されます — プロジェクトフォルダーや Program.cs があるフォルダーではありません。パスが解決できない場合、Doconut は例外をスローせず、auto‑search にフォールバックもし しません — 単にライセンスがロードされず、ビューアに透かしが表示されます。auto‑search は LicensePath、LicenseContent、LicenseStream のいずれも設定されていないときだけ実行されます。同じフォルダーにあるプラグインごとのライセンスファイル(Doconut.Viewer.<Capability>.lic)もここで読み取られるため、プラグインのライセンスがベースライセンスと同じ場所にある場合、LicensePath と AddPlugin<...>() は連携して動作します。
絶対パスを使用することを推奨します(例:IWebHostEnvironment.WebRootPath や AppContext.BaseDirectory から構築)。あるいは LicensePath を完全に省略し、以下の自動検出に任せても構いません。
builder.Services.AddDoconut(options =>
{
options.LicensePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "Doconut.Viewer.lic");
});ストリームで指定
LicenseStream は起動時に一度だけ読み取られます — ライセンスがディスク上のファイルではなくシークレットストアから取得される場合に便利です。
// 優先順位: LicenseStream > LicenseContent > LicensePath > auto-search.
builder.Services.AddDoconut(options =>
{
options.LicenseStream = licenseStream;
});コンテンツで指定
LicenseContent はライセンス文字列そのものを受け取ります — 環境変数、データベース、シークレットマネージャーから取得できます。
// データベース、環境変数、またはシークレットマネージャーから取得したライセンス XML —
// ディスク上のファイルは使用しません。LicenseStream にのみ上回られます。
builder.Services.AddDoconut(options =>
{
options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});自動検出
3つの明示的なソースをすべて設定しないと、Doconut が自らライセンスを検索します:
// 何も設定せず、Doconut は以下の2つのフォルダーだけでライセンスを検索します:
// 1. {CurrentDirectory}/wwwroot
// 2. {AppContext.BaseDirectory}/wwwroot (ビルド出力フォルダー内の wwwroot)
// まず Doconut.lic を探し、次に Doconut.Viewer.lic、さらにプラグインごとの
// Doconut.Viewer.<Capability>.lic ファイルも同時に検索します。
builder.Services.AddDoconut();探索フォルダーと、各フォルダーで検索されるファイル名は次の通りです:
1. {CurrentDirectory}/wwwroot
2. {AppContext.BaseDirectory}/wwwroot
Filenames (checked in each folder above, in order):
Doconut.lic — base viewer license (checked first)
Doconut.Viewer.lic — base viewer license
Doconut.Viewer.<Capability>.lic — per-plugin license, alongside the base licensewwwroot フォルダー外のものは読み取られません:出力フォルダー直下や wwwroot/lib 内の .lic は無視されます。
ライセンスを出力フォルダーにコピーする
プロセスがプロジェクトフォルダーから実行されない場合(公開アプリ、IIS、コンテナ、テストランナーなど)、最初の探索で見つからず、2番目の {AppContext.BaseDirectory}/wwwroot がファイルを探す必要があります。SDK のテストアプリは、ビルドごとに以下の MSBuild ターゲットでライセンスをその場所にコピーします:
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
<ItemGroup>
<DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
<StaleOutputLicenses Include="$(OutDir)wwwroot\*.lic" />
</ItemGroup>
<!-- Delete first, so renaming or removing a .lic in wwwroot also takes it out of the output. -->
<Delete Files="@(StaleOutputLicenses)" />
<Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)wwwroot" />
</Target>コピー先は $(OutDir)wwwroot である必要があります:出力ルートにコピーされた .lic は auto‑search では決して見つかりません。このページの LicensePath の例は同じ場所を指しています。
ソース管理に
.licファイルを入れないでください — アプリと同じ場所にデプロイするか、シークレットストアからLicenseContentまたはLicenseStreamを使ってライセンスを注入してください。
ライセンスがない場合に何が起こるか
ライセンスが欠如していても例外はスローされません。AddDoconut() は成功し、アプリが起動し、ビューアが実行されますが、すべてのページに評価用の透かしが表示され、オプション機能は付与されません。
見つかったものの拒否されたライセンスファイルは別です。無効な署名、改ざん、ブラックリスト登録、またはライセンスのバージョンウィンドウ外のビルドは、OpenDocumentAsync が LicenseException を License.RejectionMessage とともにスローさせます。拒否メッセージがない期限切れ(カレンダー期限切れ)のライセンスは、透かしモードのまま継続します。
プラグインには機能が必要です
対応する権利がないプラグインを登録すると状況は異なります。ライセンスが欠如している場合、レガシーな TRIAL ファイル、またはその機能が付与されていない有料ライセンスの場合、AddDoconut() は InvalidOperationException をスローし、アプリは起動しません。例えば、Converter 機能を付与するライセンスなしで 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<...>() 呼び出しを削除するか、機能を付与する有料ライセンスまたは有効な Temporary/Demo(NFR)ライセンスをインストールしてください。Temporary 登録は有効期限が過ぎても残存できるため、設定済みのアプリは再起動時にクラッシュする代わりに実行時に機能低下します。期限が切れた場合は、機能は引き続き取り消されます。
読み込まれたライセンスを検証する
IDoconutLicenseService を使用します。これは SDK が使用する真実の情報源であり、認証済み診断エンドポイントを公開したり、機能フラグを制御したりするために利用します。ライセンスの内容やキーを返さないでください。
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 をスローする | 署名、ドメイン、バージョンウィンドウ、ブラックリスト、またはプラグイン実行時ゲートがライセンスを拒否した | 例外/拒否メッセージを読み取りますが、信頼できないクライアントに公開しないでください |
次のステップ
- ライセンス — 機能、ライセンス階層、実行時に読み込まれたものの検証。
- トラブルシューティング — 透かし、拒否されたライセンス、機能エラー。
このページは役に立ちましたか?