라이선스 설정

IIS에서 Doconut이 라이선스 파일을 찾는 위치

라이선스가 없으면 Doconut은 여전히 문서를 렌더링합니다 — 모든 페이지에 평가 워터마크가 표시됩니다. 이 페이지에서는 Global.asax에서 라이선스를 제공하는 네 가지 방법, 라이선스를 제공하지 않을 때 Doconut이 찾는 위치, 그리고 플러그인 라이선스가 없을 때 발생하는 상황을 다룹니다.

라이선스를 제공하는 네 가지 방법

DoconutOptions에는 파일 경로, 스트림, 원시 내용이라는 세 가지 명시적 소스가 있으며, 설정이 없을 경우 자동 검색이 수행됩니다. 이 모든 소스는 DoconutHost.Initialize에서 한 번 읽힙니다. 둘 이상이 설정된 경우 우선순위는 정확히 다음과 같습니다:

LicenseStream이 LicenseContent보다, LicenseContent가 LicensePath보다, LicensePath가 자동 검색보다 우선합니다.

경로로

LicensePath에 전체 경로를 지정합니다. 상대 경로는 프로세스의 현재 디렉터리를 기준으로 해석되며, IIS에서는 워커 프로세스 자체 폴더가 되므로 사이트 폴더가 아닙니다. HostingEnvironment.MapPath는 사이트 상대 경로를 전체 경로로 변환합니다:

csharp
Doconut.DoconutHost.Initialize(options =>
{
    options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
});

파일이 존재하지 않으면 Doconut은 예외를 발생시키지 않으며 자동 검색으로 백업되지도 합니다: 라이선스를 로드하지 않으며 뷰어에 워터마크가 표시됩니다. 동일 폴더에 있는 플러그인별 라이선스 파일(Doconut.Viewer.<Capability>.lic)도 함께 읽히므로, 플러그인 라이선스가 기본 라이선스 옆에 있을 경우 LicensePath와 AddPlugin<...>()가 함께 동작합니다.

스트림으로

LicenseStream은 시작 시 한 번 읽히며 — 라이선스가 디스크 파일이 아니라 임베디드 리소스나 비밀 저장소에서 제공될 때 유용합니다.

csharp
// Precedence: LicenseStream > LicenseContent > LicensePath > auto-search.
Doconut.DoconutHost.Initialize(options =>
{
    options.LicenseStream = licenseStream;
});

내용으로

LicenseContent는 라이선스 텍스트 자체를 사용합니다 — 환경 변수, 데이터베이스, 또는 비밀 저장소에서 가져올 수 있어 사이트에 라이선스 파일을 배포할 필요가 없습니다.

csharp
// License XML from a database, an environment variable or a secret store -
// no file on disk. Beaten only by LicenseStream.
Doconut.DoconutHost.Initialize(options =>
{
    options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});

자동 검색

세 가지 중 어느 것도 설정하지 않으면 Doconut이 스스로 라이선스를 검색합니다:

csharp
// Configure nothing, and Doconut searches for the license itself, in this order:
//   1. {CurrentDirectory}\wwwroot
//   2. {AppContext.BaseDirectory}\wwwroot   (under IIS: the site's root folder)
// It looks for Doconut.lic first, then Doconut.Viewer.lic, plus any per-plugin
// Doconut.Viewer.<Capability>.lic files alongside it.
Doconut.DoconutHost.Initialize();

다음 두 폴더를 순서대로 검색하며, 찾는 파일은 다음과 같습니다:

text
1. {CurrentDirectory}\wwwroot
2. {AppContext.BaseDirectory}\wwwroot

In each folder:
  Doconut.lic                        — if found, this is the only file read
  Doconut.Viewer.lic                 — base viewer license
  Doconut.Viewer.<Capability>.lic    — per-plugin licenses, read only next to Doconut.Viewer.lic

IIS 및 IIS Express에서 AppContext.BaseDirectory는 사이트의 루트 폴더이며 — Web.config가 위치한 폴더 — bin 폴더가 아닙니다. 따라서 라이선스는 사이트 루트 아래의 wwwroot에 있어야 합니다:

text
MySite\
  Web.config
  Global.asax
  bin\
  wwwroot\
    Doconut.Viewer.lic
    Doconut.Viewer.Converter.lic

프로젝트에서는 Web.config 옆에 wwwroot\*.lic 파일을 두고 사이트와 함께 폴더를 배포합니다. 빌드 단계에서 별도로 복사할 필요가 없습니다. .lic 파일을 다른 위치 — bin\ 안, Web.config 옆, 혹은 wwwroot 하위 폴더 — 에 두면 절대 읽히지 않습니다.

.lic 파일을 소스 제어에 포함하지 마세요. 사이트와 함께 배포하거나 비밀 저장소에서 LicenseContent 또는 LicenseStream을 통해 라이선스를 제공하세요.

라이선스가 없을 때 발생하는 일

라이선스가 없다고 해서 예외가 발생하지는 않습니다. DoconutHost.Initialize가 성공하고 사이트가 시작되며 뷰어가 실행되지만, 모든 페이지에 평가 워터마크가 표시되고 선택적 기능이 부여되지 않습니다.

찾았지만 거부된 라이선스 파일은 다른 경우입니다. 서명이 유효하지 않거나 변조되었거나 라이선스 버전 기간을 벗어난 빌드인 경우 OpenDocumentAsync가 이유와 함께 LicenseException을 발생시킵니다.

플러그인은 시작 시 라이선스가 필요합니다

라이선스가 부여되지 않은 기능을 가진 플러그인을 등록하면 애플리케이션 시작 시 중단됩니다. DoconutHost.Initialize가 Application_Start에서 예외를 발생시킵니다:

text
InvalidOperationException: The Converter plugin is registered via AddPlugin but no active
license grants Converter. Remove the AddPlugin<...>() call or install a license (or
trial/demo) that includes Converter.

System.Web에서는 브라우저에서 해당 메시지를 볼 수 없습니다. 사이트에 대한 모든 요청은 빈 500 응답을 반환하며 — 오류 페이지도, 스택 트레이스도, IIS 로그에도 아무것도 없습니다. 예외는 Windows 이벤트 로그(Application 로그, 소스 ASP.NET)에만 기록됩니다. AddPlugin 라인을 추가한 직후 사이트 전체가 응답을 멈추면, 코드 이전에 wwwroot의 라이선스 파일을 확인하세요: 플러그인의 Doconut.Viewer.<Capability>.lic 파일이 Doconut.Viewer.lic 옆에 있어야 하며, 기본 라이선스가 없으면 플러그인 파일은 전혀 읽히지 않습니다.

로드된 라이선스 확인

IDoconutLicenseService는 SDK가 사용하는 동일한 진실의 원천입니다. DoconutHost.Services에서 이를 가져와 인증된 진단 엔드포인트를 제공하거나 기능 플래그를 제어하세요 — 라이선스 내용을 절대 반환하지 마십시오:

csharp
// GET /License/Status
public ActionResult Status()
{
    var license = Doconut.DoconutHost.Services.GetRequiredService<IDoconutLicenseService>();

    return Json(new
    {
        viewer     = license.IsViewerLicensed || license.IsTemporary,
        temporary  = license.IsTemporary,
        search     = license.IsCapabilityGranted(LicenseCapability.Search),
        annotation = license.IsCapabilityGranted(LicenseCapability.Annotation),
        converter  = license.HasConverter,
        dicom      = license.HasDicom
    }, JsonRequestBehavior.AllowGet);
}

라이선스는 DoconutHost.Initialize에서 한 번 읽힙니다. 라이선스 파일을 교체한 후에는 애플리케이션 풀을 재시작하거나 Web.config를 수정하여 Application_Start가 다시 실행되도록 합니다.

문제 해결

증상가능한 원인확인 방법
뷰어는 작동하지만 모든 페이지에 워터마크가 표시됨라이선스를 찾을 수 없음.lic 파일이 <site root>\wwwroot에 있나요? 위의 상태 엔드포인트를 호출하세요
플러그인을 추가한 직후 모든 요청이 빈 500 응답등록된 플러그인에 라이선스가 부여되지 않음Windows 이벤트 로그, 소스 ASP.NET; 플러그인의 .lic 파일이 Doconut.Viewer.lic 옆에 있음
LicensePath가 로컬에서는 작동하지만 서버에서는 작동하지 않음상대 경로가 워커 프로세스 폴더를 기준으로 해석됨HostingEnvironment.MapPath("~/wwwroot/...")를 사용해 구현하세요
교체한 .lic 파일이 효과가 없음라이선스가 애플리케이션 시작 시 읽혔음애플리케이션 풀을 재시작하세요
OpenDocumentAsync가 LicenseException을 발생시킴라이선스를 찾았지만 거부됨예외 메시지를 확인하고 신뢰할 수 없는 클라이언트에게는 표시하지 마세요

다음 단계

  • 라이선스 — 기능 및 런타임에서 확인하는 방법.
  • 문제 해결 — 워터마크, 시작 실패 및 기타 증상.

이 페이지가 도움이 되었나요?