ライセンス設定

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

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

ライセンスは 一度だけ、AddDoconut() 中に 読み込まれます。これは以前の .NET Standard ライブラリとは異なり、そこではライセンスは Viewer インスタンスに渡すか、静的な Viewer.DoconutLicense(...) / Viewer.SetLicensePlugin(...) 呼び出しで設定していました。このリリースではそれらのメソッドは起動メカニズムではなくなっています — 詳細は 移行ガイド を参照してください。

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

4つあります:DoconutOptions 上の3つの明示的なソース(ストリーム、生のコンテンツ、またはファイルパス)と、設定されていない場合の自動検出です。複数が設定された場合、優先順位は以下の通りです:

LicenseStream が LicenseContent、LicensePath、自動検索 の順に優先されます。

パスで指定

LicensePath は File.Exists にそのまま渡されます。相対パスはプロセスの 現在の作業ディレクトリ を基準に解決されます — プロジェクトフォルダや Program.cs が存在するフォルダではありません。パスが解決できない場合、Doconut は例外を投げず、自動検索 にフォールバックもし ません — 単にライセンスがロードされず、ビューアに透かしが表示されます。自動検索 は LicensePath、LicenseContent、または LicenseStream のいずれも設定されていないときにのみ実行されます。同じフォルダ内のプラグインごとのライセンスファイル (Doconut.Viewer.<Capability>.lic) もそれと共に読み込まれるため、LicensePath と AddPlugin<...>() はベースライセンスの横にプラグインライセンスがある場合に連携して動作します。

絶対パスを使用することを推奨します(例として IWebHostEnvironment.WebRootPath や AppContext.BaseDirectory から構築)。あるいは LicensePath を完全に省略し、以下の自動検出に任せても構いません。

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

ストリームで指定

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

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

コンテンツで指定

LicenseContent はライセンス文字列そのものを受け取ります — 環境変数、データベース、またはシークレットマネージャから取得する場合です。

csharp
// データベース、環境変数、またはシークレットマネージャーからの License XML —
// ディスク上にファイルはありません。LicenseStream のみが上回ります。
builder.Services.AddDoconut(options =>
{
    options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});

自動検出

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

csharp
// 何も設定せず、Doconut がライセンスを自ら検索します。対象は以下の 2 つのフォルダーのみです:
//   1. {CurrentDirectory}/wwwroot
//   2. {AppContext.BaseDirectory}/wwwroot   (ビルド出力フォルダー内の wwwroot)
// まず Doconut.lic を探し、次に Doconut.Viewer.lic を探し、さらに各機能ごとのものも探します
// それと同じ場所に Doconut.Viewer.<Capability>.lic ファイルがあります。
builder.Services.AddDoconut();

検索対象となるフォルダは順番に以下で、各フォルダで探すファイル名は次の通りです:

text
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-capability license, alongside the base license

wwwroot フォルダ外のものは読み込まれません:出力フォルダ自体や wwwroot/lib にある .lic は無視されます。

以前に Viewer コンストラクタにライセンスパスの List<string>(機能ごとに1つ)を渡していた場合、その補助ファイルを Doconut.Viewer.lic の隣に置き、自動検出に拾わせてください。DoconutOptions にはパスのリストオプションはありません。

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

プロセスがプロジェクトフォルダーから実行されない場合—公開アプリ、IIS、コンテナ、テストランナーなど—最初の探索に失敗し、2番目の探索である {AppContext.BaseDirectory}/wwwroot がファイルを見つける必要があります。SDK のテストアプリは、この MSBuild ターゲットを使用して、ビルドのたびにライセンスをそこにコピーします。

xml
<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 は自動検索で決して見つかりません。このページの LicensePath の例は同じ場所を指しています。

.lic ファイルをソース管理から除外してください — アプリと一緒にデプロイするか、シークレットストアから LicenseContent または LicenseStream を介してライセンスを注入してください。

ライセンスがない場合に何が起こるか

ライセンスが欠如していても例外はスローされません。AddDoconut() が成功し、アプリが起動し、ビューアが実行されますが、すべてのページに評価用の透かしが付与され、オプション機能は付与されません。

見つかったが拒否されたライセンスファイルは別です。無効な署名、改ざん、ブラックリスト登録、またはライセンスのバージョンウィンドウ外でのビルドは、OpenDocumentAsync が LicenseException をスローし、License.RejectionMessage を伴います。拒否メッセージがないカレンダー期限切れのライセンスは、透かしモードで継続します。

プラグインには機能が必要です

対応する権利がないプラグインを登録すると結果は異なります:ライセンスが欠如している場合、レガシーな TRIAL ファイルがある場合、またはその機能を持たない有料ライセンスの場合、AddDoconut() が InvalidOperationException をスローし、アプリは起動しません。例えば、Converter を付与するライセンスなしで 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<...>() 呼び出しを削除するか、機能を付与する有料ライセンスまたは有効な Temporary/Demo (NFR) ライセンスをインストールしてください。Temporary 登録は有効期限が過ぎても存続できるように許可されているため、既に構成されたアプリは再起動時にクラッシュする代わりに実行時に機能低下します。期限が切れると、機能は依然として取り消されます。

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

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

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 ファイルに効果がないシングルトンのライセンスサービスがすでに作成されていたアプリケーションを再起動する
OpenDocumentAsync が LicenseException をスローする署名、ドメイン、バージョンウィンドウ、ブラックリスト、またはプラグイン実行時ゲートがライセンスを拒否した例外/拒否メッセージを読み取り、信頼できないクライアントに公開しない
機能別ライセンスは以前は機能したが現在は機能しない以前のコードが明示的にライセンスパスを Viewer コンストラクタに渡していた伴随する .lic ファイルを Doconut.Viewer.lic の隣に移動し、自動検出にロードさせる

次のステップ

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