Viewer の仕組み
ドキュメントリクエストのライフサイクル
Doconut はドキュメントをページ化された画像として ASP.NET Core ミドルウェアを通じて配信します。ライフサイクル(オープン、トークン、ページリクエスト、クローズ)を理解すれば、エラーメッセージを含むほぼすべての挙動を説明できます。
3つの主要コンポーネント
Viewer— 注入する公開サービスです。ドキュメントを開き、セッショントークンを返します。- ドキュメントセッション — ロードされたドキュメントを保持するサーバー側オブジェクトで、
IMemoryCacheのトークンをキーにします。 - Doconut ミドルウェア —
UseDoconut()によって追加され、ブラウザウィジェットが行うすべてのリクエスト(pages、thumbnails、search、annotations…)に応答し、常にトークンで認証されます。
Viewer はステートレス — 設計上
Viewer は sealed で、リクエストごとのドキュメント状態を保持せず、意図的に IDisposable を実装 していません。セッションはセッションマネージャーで独立して管理され、キャッシュの期限切れまたは明示的な CloseDocument(token) によってクリーンアップされます。
必要な場所へ注入してください:
csharp
app.MapPost("/api/open", async (string fileName, Viewer viewer) =>
{
var token = await viewer.OpenDocumentAsync($"files/{fileName}");
return Results.Content(token, "text/plain");
});OpenDocumentAsync の内部で何が起こるか
- ライセンスゲート。 拒否された、またはバージョン期限切れのライセンス(ブラックリスト登録、改ざん、またはライセンスの更新ウィンドウ外のビルド)は即座に
LicenseExceptionをスローし、拒否理由がメッセージとして付与されます。無効なライセンス(欠如している場合とは異なる)に対しては、オープンは決して黙って劣化しません。カレンダー期限切れの一時的またはサブスクリプションライセンスは例外で、例外はスローせず、透かしに劣化します。 - セッション作成。 ビューアファクトリはファイル拡張子に応じた適切なフォーマットビューアを選択し、ドキュメントをロードします(Rendering Pipeline 参照)。セッションは新しい GUID トークンで
IMemoryCacheに保存され、スライディング有効期限(DocOptions.TimeOut分、デフォルト 60 分)を持ちます。各ページリクエストで期限がリセットされます。 - セキュリティ登録。
UnsafeMode = false(デフォルト)の場合、トークンは呼び出し元の ASP.NET セッションに結び付けられます:secure-{token}マーカーがセッションに書き込まれ、ドキュメントを開いたブラウザセッションだけがページをリクエストできるようになります。 - トークンが返されます。 これが以降のすべての操作に必要な唯一の認証情報です。
3 つのオーバーロードは入力が異なるだけです:ファイルパス、ファイルパスとフォーマット別設定(PdfConfig、WordConfig …)、または Stream と拡張子からフォーマット検出を行う FileInfo です。
ウィジェットがページを取得する方法
クライアントウィジェットはトークンをクエリ文字列に付けて Doconut ミドルウェアを呼び出します。ミドルウェアの動作はリクエスト内容に依存します:
| クエリ | 用途 |
|---|---|
?token=…&page=N | レンダリングされたページ画像(PNG) |
?token=…&page=N&thumb=1 | サムネイル |
?token=…&zoom=… | ズームされたページのレンダリング |
?token=…&search=term | 全文検索(ライセンス制御) |
?token=…&bookmarks | ドキュメントのアウトライン/ブックマーク |
?token=…© / &showlinks / &fileFormat / &meta | テキストコピー、ハイパーリンク、フォーマット情報、DICOM 技術メタデータ |
?token=…&action=rotate/flip/close | ページ操作と明示的なクローズ |
?token=…&AnnSave=… / &AnnLoad | 注釈の保存/読み込み |
これらのパスはすべて最初に検証されます:
- トークンがない場合 → ミドルウェアは 404 を返します(
ShowDoconutInfo = trueの場合はバージョンバナーを表示)。 - トークンが不明または期限切れの場合 → 「Document session not found. Please re-open document.」というエラー画像が返されます。※実際の表示は日本語に置き換えて「ドキュメントセッションが見つかりません。ドキュメントを再度開いてください。」とします。
- セッションミドルウェアが構成されていない場合(
UnsafeMode = false)→ HTTP 500 と共に「Session middleware not configured. Call UseSession() before UseDoconut().」というエラーメッセージが返されます。日本語では「セッションミドルウェアが構成されていません。UseDoconut() の前に UseSession() を呼び出してください。」 - 別のブラウザセッションで開かれたトークンの場合 → 「You Are Not Authorized To View This Page.」というエラー画像が返されます。日本語では「このページを表示する権限がありません。」
ドキュメントのクローズ
csharp
viewer.CloseDocument(token);CloseDocument はキャッシュからセッションを削除し(これにより基盤となるドキュメントエンジンが破棄され、メモリが即座に解放されます)、secure-{token} マーカーを削除し、アクセス権を取り消します。呼び出しは任意です — スライディング有効期限が自動的に同様のクリーンアップを行います — ただし大きなドキュメントの場合、ユーザーが完了した瞬間にメモリを解放する礼儀として呼び出すことが推奨されます。
まとめ
- 1 つのオープンドキュメント = 1 つのセッション = 1 つのトークン。トークンはブラウザセッションごとに発行され、グローバルな URL ではありません。
- トークンはスライディングウィンドウで期限切れになります。
DocOptions.TimeOutを超えてアイドル状態のビューアは再オープンが必要です。 Viewerは自由に注入・共有でき、すべての状態はセッションが保持します。
このページは役に立ちましたか?