
Doconut を使用した .NET の安全なドキュメント管理ビューアの構築
Doconut を使用したドキュメント管理の実装
.NET ポータルの ドキュメント管理 ワークフローは通常、3 つの要素が必要です:
- ビューアを一から作成せずに、PDF、Office ファイル、CAD 図面、画像を読み込む方法。
- ロードされたドキュメントを現在のブラウザ セッションに結び付ける安全なトークン。
- ユーザーが終了した時点でメモリを解放するクリーンアップ手順。
Doconut は、単一の Viewer サービス、軽量な IMemoryCache セッション、明示的な CloseDocument 呼び出しにより、これらすべてを提供します。
1. DI コンテナにビューアを登録する
アプリケーションの起動時に、公式ドキュメントで説明されている Doconut の登録メソッドを呼び出して、Doconut サービスを DI コンテナに追加します。この手順でビューア、ライセンス処理、ドキュメントセッションを保持するインメモリ キャッシュが登録されます。
登録時にライセンスが検証されるため、欠落または無効なライセンスは起動時にすぐに失敗し、最初のリクエストがサーバーに到達する前に問題を把握できます。
2. ページ画像、サムネイル、アノテーションデータを提供するミドルウェアを挿入する
リクエスト パイプラインに Doconut ミドルウェアを設定し、?token= クエリ文字列を含むすべてのリクエストが Doconut によって処理されるようにします。UnsafeMode が false(デフォルト)の場合、ミドルウェアはデフォルトのセキュリティ マーカー(secure-{token})を適用し、ページ画像、サムネイル、アノテーション データを提供します。
ミドルウェアを専用のブランチに配置することで、パイプラインの他の部分に影響を与えず、スティッキー セッションなしで水平スケーリングが可能になります。
3. ドキュメントを開き、不透明なセッショントークンを取得する
ファイルパス(またはストリーム)を受け取りトークンを返す単一のエンドポイントを作成します。トークンはクライアント ウィジェットが参照できる唯一の認証情報です。
app.MapPost("/api/open", async (Viewer viewer) =>
{
// トークンは不透明です — ウィジェットに渡し、決してログに記録したり永続化したりしないでください。
string token = await viewer.OpenDocumentAsync("wwwroot/files/Contract.pdf");
return Results.Ok(new { token });
});
OpenDocumentAsync の内部で何が起こるか
- ライセンスゲート – 無効なライセンスは
LicenseExceptionを即座にスローします。 - セッション作成 – Doconut は適切なフォーマット ビューア(PDF、Word、DWG、…)を選択し、エンジンを GUID トークンの下で
IMemoryCacheに保存します。 - セキュリティ登録 –
UnsafeMode = falseを使用して、トークンはsecure-{token}マーカーを介して呼び出し元の ASP.NET セッションに結び付けられます。そのブラウザ セッションだけがページを要求できます。 - トークン返却 – クライアントはトークンを受け取り、以降のすべてのリクエストで (
/DocImage.axd?token=…) を使用します。
デフォルトのスライディング有効期限は 60 分です(DocOptions.TimeOut で設定可能)。各ページリクエストでタイマーがリセットされ、アイドル状態のセッションは自動的に消失します。
4. クライアント側でドキュメントをレンダリングする
ブラウザからエンドポイントを呼び出し、トークンを取得して Doconut ウィジェットに渡します:
fetch('/api/open', { method: 'POST' })
.then(r => r.json())
.then(d => {
const token = d.token;
objViewer.View(token); // Doconut が提供する JavaScript ウィジェット
});
ウィジェットは内部でページ、サムネイル、検索、アノテーションのリクエストを発行し、すべて同じ token を含みます。トークンがサーバー側セッションに結び付けられているため、悪意のあるユーザーが他のユーザーのドキュメントをハイジャックすることはできません。
5. ユーザーがビューアを離れたらすぐにドキュメントを閉じる
大容量の PDF や CAD ファイルの場合は、レンダリング エンジンを直ちに解放すべきです。サーバー側エンドポイントまたはウィジェットの “unload” イベントから CloseDocument を呼び出します。
// サーバー側エンドポイント
app.MapPost("/api/close", (Viewer viewer, string token) =>
{
viewer.CloseDocument(token);
return Results.Ok();
});
// ウィジェットからの直接呼び出し(トークンをバックエンドに公開する場合)
viewer.CloseDocument(token);
CloseDocument はキャッシュからセッションを削除し、基盤となるドキュメント エンジンを破棄し、secure-{token} マーカーを削除し、アクセス権を取り消します。スライディング有効期限でも最終的に同様の処理が行われますが、明示的なクローズによりユーザーが終了した瞬間にメモリが回収されることが保証されます。
6. オプション: サーバー側でドキュメントを変換する
ワークフローでアップロードされた Word ファイルの PDF エクスポートが必要な場合は、Doconut の設定で Converter プラグインを有効にします(ドキュメント参照)。プラグインが登録されたら DocumentConverter を注入し、その ConvertAsync メソッドを呼び出すことができます。変換はサーバー上で実行されるため、Web サーバーに Office をインストールする必要はありません。
7. エンタープライズ向けドキュメント管理のスケーリング考慮点
- ステートレス フロントエンド – ビューア ウィジェットはドキュメント データを保持せず、重い処理はすべてサーバー側で行われます。
- 分散キャッシュ – 複数のウェブファーム ノードを運用する場合は、デフォルトのインメモリ キャッシュを分散プロバイダー(Redis、NCache)に置き換えます。ミドルウェアが設定された
IMemoryCacheから読み取るため、トークンとセッションのマッピングはそのまま機能します。 - バックグラウンド ジョブ – バックグラウンド ワーカーでドキュメントを事前に開き、トークンをキャッシュして後で UI に渡すことができます。ただし、各トークンはセッションごとに一度だけ使用でき、再利用するには新しい
OpenDocumentAsync呼び出しが必要です。
これらのパターンにより、ビューア ロジックを書き直すことなく、単一サーバーのイントラネット ポータルからマルチリージョンのクラウドサービスまでスケールする ドキュメント管理 プラットフォームを構築できます。
8. 本番環境向け実装のクイックチェックリスト
| ステップ | アクション |
|---|---|
| 1 | Program.cs に Doconut サービスを登録(ライセンスを検証)。 |
| 2 | 専用ブランチに Doconut ミドルウェアを追加。 |
| 3 | OpenDocumentAsync を呼び出す /api/open エンドポイントを公開。 |
| 4 | クライアントで返されたトークンを objViewer.View(token) に渡す。 |
| 5 | ビューアが非表示になるかページがアンロードされたときに CloseDocument(token) を呼び出す。 |
| 6 | (オプション)サーバー側変換が必要な場合は ConverterPlugin を有効化。 |
| 7 | (オプション)水平スケーリングのために IMemoryCache を分散キャッシュに置き換える。 |
このリストに従えば、Doconut のネイティブ .NET ビューア上に構築された、完全で安全かつ高性能な ドキュメント管理 フローが完成します。