ASP.NET Core

세 번의 미들웨어 호출, 재작성 필요 없음

Doconut은 ASP.NET Core의 다른 모든 것과 같은 방식으로 등록됩니다: 컨테이너의 서비스와 파이프라인의 미들웨어. 인증, 로깅, DI 그래프 및 배포 방식을 상속받으며, 이는 옆에서가 아니라 내부에서 실행되기 때문입니다.

3
통합을 위한 미들웨어 호출
75
기본 제공 파일 확장자
2
배포 대상: Windows, Docker

문제

아무도 예산을 잡지 않는 통합 비용

대부분의 문서 뷰어는 별도의 서비스로 제공됩니다. 이는 두 번째 배포 단위, 두 번째 자격 증명 세트, 문서가 이동하는 네트워크 홉, 그리고 새벽 2시에 누군가에게 알릴 또 다른 문제가 있다는 의미입니다.

Doconut은 라이브러리입니다. AddDoconut()는 서비스 컬렉션에 추가하고, UseDoconut()는 파이프라인에 삽입합니다. 이는 프로세스 ID 하에서 실행되며, 설정을 확인하고, 로거에 기록하며, 애플리케이션을 배포하는 방식으로 배포됩니다.

실질적인 결과는 권한 부여가 제자리를 유지한다는 것입니다. 자체 권한 검사를 마친 후 OpenDocumentAsync()를 호출하면, 뷰어는 전달한 문서만 렌더링할 수 있습니다.

기능

미들웨어가 제공하는 것

Razor Pages, MVC 및 최소 API

뷰어는 호스팅 스타일에 얽매이지 않습니다. Razor 뷰 또는 정적 페이지에서 마운트 div를 렌더링하고, 컨트롤러 액션, 페이지 핸들러 또는 매핑된 엔드포인트에서 문서를 엽니다.

인증은 그대로 유지

엔드포인트가 파이프라인에 존재하므로, [Authorize]는 기존과 동일하게 작동합니다. 연동할 두 번째 신원 시스템이 없습니다.

세션 기반 문서 보안

문서 보안은 ASP.NET 세션 상태에 기반하므로 UseSession()을 UseDoconut()보다 먼저 등록해야 합니다. 이는 뷰어가 인식하는 사용자가 애플리케이션과 동일함을 의미합니다.

웹 팜 지원

로드 밸런서 뒤의 여러 노드가 렌더 캐시를 공유하므로, 한 노드에서 열린 세션이 다음 요청이 다른 노드에 도착해도 계속 작동합니다.

Windows 또는 Docker

IIS, Kestrel 또는 직접 만든 컨테이너 이미지. 통합 방식은 라이선스 파일이 마운트되는 위치를 제외하고는 변하지 않습니다.

동일 파이프라인 내 변환

Converter 플러그인을 사용하면 DocumentConverter.ConvertAsync()가 동일 프로세스에서 실행됩니다 — 별도 서비스, 임시 업로드, 왕복 전송이 없습니다.

통합

등록 및 개방형 엔드포인트

UserMayRead와 ResolvePath는 사용자의 코드입니다. 이것이 핵심이며, Doconut은 어떤 문서가 존재하는지 또는 누가 볼 수 있는지 절대 알지 못합니다.

지원되는 플랫폼

Razor PagesMVCMinimal APIs.NET 8.NET 6WindowsDocker
csharp
// Program.cs
builder.Services.AddDoconut(options =>
{
    options.LicensePath = "Doconut.Viewer.lic";
});
builder.Services.AddSession(); // document security rides on session state

var app = builder.Build();

app.UseSession();          // call UseSession() before UseDoconut()
app.UseDoconutResources(); // must be registered before UseDoconut()
app.UseDoconut();

// Open the document server-side, behind your own authorization
app.MapPost("/api/open", async (Viewer viewer, HttpContext ctx, string documentId) =>
{
    if (!await ctx.UserMayRead(documentId))
        return Results.Forbid();

    // The token is opaque — hand it to the widget, never log or persist it.
    string token = await viewer.OpenDocumentAsync(ResolvePath(documentId));
    return Results.Ok(new { token });
}).RequireAuthorization();

세부 정보

등록 순서 및 주의사항

  • UseSession()은 UseDoconut()보다 먼저 호출되어야 합니다. 문서 보안이 이에 의존합니다.
  • UseDoconutResources()는 UseDoconut()보다 먼저 호출되어야 하며, 애플리케이션 나머지와 동일한 인증 뒤에 위치해야 합니다.
  • Razor 뷰는 Doconut.Viewer를 주입하고 ReferenceCss / ReferenceScripts를 출력합니다; jQuery는 뷰어 스크립트보다 먼저 로드되어야 합니다.
  • options.LicensePath를 구성에서 설정하여 라이선스 파일을 이미지에 포함시키는 대신 비밀로 마운트할 수 있게 합니다.

자주 묻는 질문

.NET 6에서도 .NET 8과 같이 작동합니까?

예. 두 버전 모두 지원되며 동일한 DI+미들웨어 아키텍처를 사용합니다. 버전별 상세 정보가 필요하면 각각 전용 페이지가 있습니다.

Razor 컴포넌트나 태그 헬퍼가 있나요?

아니요, 이는 의도된 설계입니다. 통합은 항상 미들웨어와 JavaScript 위젯으로 이루어져 Razor Pages, MVC, Web Forms, Blazor 모두에서 동일하게 유효합니다.

로드 밸런서 뒤에서 어떻게 동작합니까?

공유 렌더 캐시를 통해 웹 팜 및 분산 배포를 지원합니다. 한 노드에서 연 파일은 이후 요청이 다른 노드에 도달해도 읽을 수 있습니다.

서버에 Office를 설치해야 하나요?

아니요. 렌더링은 네이티브이며 Office 인터옵, 헤드리스 Word, COM 자동화가 필요하지 않습니다.

내 문서에 적용해 보세요

임시 라이선스는 요청하는 데 몇 분 정도 걸리며 완전히 사용자의 컴퓨터에서 실행됩니다. 중요한 파일은 현재 뷰어를 이미 깨뜨리고 있는 파일들입니다.