ライセンス設定
Doconut がライセンスファイルを探す場所
ライセンスがなくても、Doconut はドキュメントをレンダリングします — 各ページには評価用の透かしが表示されます。このページでは、ライセンスを提供する4つの方法と、複数が設定された場合の正確な優先順位について説明します。
ライセンスを提供する4つの方法
4つあります:DoconutOptions 上の3つの明示的なソース — ストリーム、 生のコンテンツ、またはファイルパス — と、いずれも設定されていない場合の自動検出です。複数が設定されている場合、優先順位は以下の通りです:
LicenseStream が LicenseContent、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 > 自動検索。
builder.Services.AddDoconut(options =>
{
options.LicenseStream = licenseStream;
});コンテンツで指定
LicenseContent はライセンス本文そのものを受け取ります — 環境変数、データベース、またはシークレットマネージャから取得できます:
// データベース、環境変数、またはシークレットマネージャーからの License 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>
<!-- まず削除します。これにより、wwwroot 内の .lic を名前変更または削除すると、出力からも除外されます。 -->
<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 をスローする | 署名、ドメイン、バージョンウィンドウ、ブラックリスト、またはプラグイン実行時ゲートがライセンスを拒否した | 例外/拒否メッセージを読み取り、信頼できないクライアントに公開しないでください |
次のステップ
- Licensing — 機能、ライセンス階層、そして実行時にロードされたものの検証。
- Troubleshooting — 透かし、拒否されたライセンス、機能エラー。
このページは役に立ちましたか?