뷰어 작동 방식
문서 요청 라이프사이클
Doconut는 페이지화된 이미지로 문서를 렌더링하며, 이는 Web.config에 등록된 HTTP 핸들러를 통해 제공됩니다. 라이프사이클(열기, 토큰, 페이지 요청, 닫기)을 이해하면 오류 메시지를 포함한 거의 모든 동작을 설명할 수 있습니다.
움직이는 구성 요소들
Viewer—DoconutHost.Services에서 해결하는 공개 서비스입니다. 문서를 열고 세션 토큰을 반환합니다.- 문서 세션 — 로드된 문서를 보관하는 서버 측 객체로, 토큰 아래 메모리에 유지됩니다.
DocImage.axd—Web.config에 선언된Doconut.DocImageHandler입니다. 브라우저 위젯이 만드는 모든 요청(페이지, 썸네일, 검색, 주석 등)에 응답하며, 항상 토큰으로 식별됩니다./doconut-res/*— 위젯 자체의 스크립트, 스타일 및 아이콘을 제공하는Doconut.DoconutResourceModule입니다.
Viewer는 무상태 — 설계상
Viewer는 요청당 문서 상태를 보유하지 않으며 IDisposable을 구현하지 않습니다. 세션은 Viewer와 독립적으로 존재하며 만료되거나 명시적인 CloseDocument(token)에 의해 정리됩니다. System.Web에는 생성자 주입이 없으므로 필요할 때 해결하십시오 — 일반적으로 컨트롤러 액션에서 사용합니다:
// POST /ViewerApi/Open?fileName=Sample.pdf
[HttpPost]
public async Task<ActionResult> Open(string fileName)
{
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
var path = Server.MapPath("~/files/" + Path.GetFileName(fileName));
var token = await viewer.OpenDocumentAsync(path);
return Content(token, "text/plain");
}OpenDocumentAsync 내부에서 일어나는 일
- 라이선스 게이트. 거부된 라이선스(변조, 블랙리스트에 포함되었거나 라이선스 업데이트 기간 외에 빌드된 경우)는 즉시
LicenseException을 발생시키며, 이유를 메시지로 제공합니다. 잘못된 라이선스에서는 열기가 조용히 낮아지지 않으며; 누락된 라이선스는 워터마크만 적용됩니다. - 세션 생성. 뷰어 팩토리는 파일 확장자에 맞는 포맷 뷰어를 선택하고 문서를 로드합니다(렌더링 파이프라인 참고). 세션은 새로운 무작위 토큰 아래 메모리에 저장되며
DocOptions.TimeOut분(기본 60)의 슬라이딩 만료를 가집니다. 모든 페이지 요청이 시계를 재설정합니다. - 접근 권한 부여.
UnsafeMode = false(기본값)인 경우, 토큰은 해당 요청을 연 ASP.NET 세션에 바인딩됩니다:secure-{token}항목이 해당 세션에 기록됩니다. 따라서 열기는 세션 상태가 있는 요청에서 실행되어야 합니다 — 세션 및 보안 참고. - 토큰이 반환됩니다. 이는 브라우저가 이후 모든 작업에 필요한 유일한 식별자입니다.
비동기 오버로드는 파일 경로, 파일 경로와 포맷별 설정(PdfConfig, WordConfig 등), 혹은 확장자를 통해 포맷을 선택하는 Stream과 FileInfo를 받습니다. 비동기 페이지를 사용하지 않는 Web Forms 코드 비하인드에서는 OpenDocument가 동일한 세 가지 입력을 동기식으로 제공합니다(경로, 파일 이름이 있는 스트림, 파일 이름이 있는 바이트 배열).
위젯이 페이지를 가져오는 방법
위젯은 쿼리 문자열에 토큰을 포함시켜 DocImage.axd를 호출합니다. 핸들러가 수행하는 작업은 요청에 따라 달라집니다.
| 쿼리 | 목적 |
|---|---|
?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 | 페이지 작업 및 명시적 닫기(POST) |
?token=…&AnnSave=… / &AnnLoad | 주석 저장 및 로드 |
각 요청은 먼저 확인됩니다:
- 토큰 없음 →
404, 또는ShowDoconutInfo = true일 때 버전 배너가 표시됩니다. - 이 ASP.NET 세션에 부여되지 않은 토큰 →
You Are Not Authorized To View This Page.라는 오류 이미지가 반환됩니다. - 알 수 없거나 만료된 토큰 →
Document session not found. Please re-open document.라는 오류 이미지가 반환됩니다.
오류 이미지는 상태 200으로 전송되는 일반 PNG이며, 위젯은 페이지 대신 이를 표시할 수 있습니다. 상태 코드만 확인하는 모니터링 검사는 이를 제공된 페이지로 보고합니다; 실제 페이지는 수십에서 수백 KB인 반면 오류 이미지는 약 2 KB입니다.
문서 닫기
viewer.CloseDocument(token);CloseDocument는 세션을 제거하여(문서 엔진과 메모리를 즉시 해제) 현재 요청의 ASP.NET 세션에서 secure-{token} 항목을 삭제하고 토큰을 무효화합니다. 이는 선택 사항이며 — 슬라이딩 만료가 동일한 정리를 수행합니다 — 하지만 큰 문서의 경우 사용자가 완료하는 순간 메모리를 해제합니다. 브라우저에서는 objViewer.Close(true)가 DocImage.axd에 동일한 닫기 요청을 보냅니다.
주요 내용
- 하나의 열린 문서는 하나의 세션이며 하나의 토큰과 동일하며, 이를 연 ASP.NET 세션에 부여됩니다.
- 토큰은 슬라이딩 윈도우에서 만료됩니다;
DocOptions.TimeOut을 초과해 유휴 상태인 뷰어는 다시 열어야 합니다. Viewer는 자유롭게 해결하고 공유할 수 있으며, 세션이 모든 상태를 보유합니다.
이 페이지가 도움이 되었나요?