Doconut を使用した .NET の安全なドキュメント管理ビューアの構築
← Back to Blog••2 min read

Doconut を使用した .NET の安全なドキュメント管理ビューアの構築

Doconut を使用したドキュメント管理の実装

.NET ポータルの ドキュメント管理 ワークフローは通常、3 つの要素が必要です:

  1. ビューアを一から作成せずに、PDF、Office ファイル、CAD 図面、画像を読み込む方法。
  2. ロードされたドキュメントを現在のブラウザ セッションに結び付ける安全なトークン。
  3. ユーザーが終了した時点でメモリを解放するクリーンアップ手順。

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 の内部で何が起こるか

  1. ライセンスゲート – 無効なライセンスは LicenseException を即座にスローします。
  2. セッション作成 – Doconut は適切なフォーマット ビューア(PDF、Word、DWG、…)を選択し、エンジンを GUID トークンの下で IMemoryCache に保存します。
  3. セキュリティ登録 – UnsafeMode = false を使用して、トークンは secure-{token} マーカーを介して呼び出し元の ASP.NET セッションに結び付けられます。そのブラウザ セッションだけがページを要求できます。
  4. トークン返却 – クライアントはトークンを受け取り、以降のすべてのリクエストで (/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. 本番環境向け実装のクイックチェックリスト

ステップアクション
1Program.cs に Doconut サービスを登録(ライセンスを検証)。
2専用ブランチに Doconut ミドルウェアを追加。
3OpenDocumentAsync を呼び出す /api/open エンドポイントを公開。
4クライアントで返されたトークンを objViewer.View(token) に渡す。
5ビューアが非表示になるかページがアンロードされたときに CloseDocument(token) を呼び出す。
6(オプション)サーバー側変換が必要な場合は ConverterPlugin を有効化。
7(オプション)水平スケーリングのために IMemoryCache を分散キャッシュに置き換える。

このリストに従えば、Doconut のネイティブ .NET ビューア上に構築された、完全で安全かつ高性能な ドキュメント管理 フローが完成します。


#document management#.NET#document viewer#Doconut#secure rendering#ドキュメント管理#ドキュメントビューア#安全なレンダリング