ライセンス設定

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

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

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

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

LicenseStreamLicenseContent を上回り、LicenseContentLicensePath を上回り、LicensePath が自動検索を上回ります。

パスで指定

LicensePath は指定されたまま File.Exists に渡されます。相対パスはプロセスの 現在の作業ディレクトリ に対して解決されます — プロジェクトフォルダーや Program.cs があるフォルダーではありません。パスが解決できない場合、Doconut は例外をスローせず、自動検索にフォールバックもしません — 単にライセンスを読み込まず、ビューアに透かしが表示されます。自動検索は 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") ?? "";
});

自動検出

LicensePathLicenseContentLicenseStream の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 と自動検索で使用される 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() は成功し、アプリは起動し、ビューアは動作します — ただし各ページに評価用の透かしが付与され、オプション機能は付与されません。

見つかったが拒否されたライセンスファイルは別です。署名が無効、改ざん、ブラックリスト登録、またはライセンスの有効バージョン期間外のビルドは、OpenDocumentAsyncLicenseException をスローし、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 ファイルに効果がないシングルトンのライセンスサービスがすでに作成されているアプリケーションを再起動する
OpenDocumentAsyncLicenseException をスローする署名、ドメイン、バージョン期間、ブラックリスト、またはプラグイン実行時のゲートがライセンスを拒否した例外/拒否メッセージを読み取るが、信頼できないクライアントには公開しない

次のステップ

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