라이선스 설정

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

라이선스가 없으면 Doconut은 여전히 문서를 렌더링하지만 — 모든 페이지에 평가용 워터마크가 표시됩니다. 이 페이지에서는 라이선스를 제공하는 네 가지 방법과 여러 방법이 동시에 설정된 경우 정확한 우선 순위를 다룹니다.

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

네 가지가 있습니다: DoconutOptions에 명시된 세 가지 소스 — 스트림, 원시 내용, 파일 경로 — 그리고 어느 것도 설정되지 않았을 때의 자동 검색. 여러 소스가 동시에 설정되면 우선 순위는 다음과 같습니다:

LicenseStream > LicenseContent > LicensePath > 자동 검색.

경로별

LicensePath는 주어진 대로 File.Exists에 전달됩니다. 상대 경로는 프로세스의 현재 작업 디렉터리를 기준으로 해석됩니다 — 프로젝트 폴더가 아니라 Program.cs가 위치한 폴더도 아닙니다. 경로가 해석되지 않으면 Doconut은 예외를 발생시키지 않으며 자동 검색으로 대체되지도 않습니다 — 단순히 라이선스를 로드하지 않아 뷰어에 워터마크가 표시됩니다. 자동 검색은 LicensePath, LicenseContent, LicenseStream 중 어느 것도 설정되지 않았을 때만 실행됩니다.

절대 경로를 사용하세요 (예: IWebHostEnvironment.WebRootPath 또는 AppContext.BaseDirectory에서 빌드) 혹은 LicensePath를 완전히 생략하고 아래 자동 검색에 의존하십시오.

csharp
builder.Services.AddDoconut(options =>
{
    options.LicensePath = Path.Combine(AppContext.BaseDirectory, "Doconut.Viewer.lic");
});

스트림별

LicenseStream은 시작 시 한 번 읽히며 — 파일이 아닌 비밀 저장소에서 라이선스를 가져올 때 유용합니다.

csharp
// 우선 순위: LicenseStream > LicenseContent > LicensePath > 자동 검색.
builder.Services.AddDoconut(options =>
{
    options.LicenseStream = licenseStream;
});

내용별

LicenseContent는 라이선스 텍스트 자체를 받아들입니다 — 환경 변수, 데이터베이스, 혹은 비밀 관리자를 통해서요.

csharp
// 데이터베이스, 환경 변수, 또는 비밀 관리자에서 가져온 라이선스 XML —
// 디스크에 파일이 없습니다. LicenseStream에 의해만 우선됩니다.
builder.Services.AddDoconut(options =>
{
    options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});

자동 검색

세 가지 명시적 소스를 모두 설정하지 않으면 Doconut이 스스로 라이선스를 검색합니다:

csharp
// 아무것도 구성하지 않으면 Doconut이 스스로 라이선스를 검색합니다:
//   1. {CurrentDirectory}/wwwroot
//   2. {CurrentDirectory}/wwwroot/lib
//   3. AppContext.BaseDirectory  (빌드 출력 폴더)
// Doconut.Viewer.lic 파일과 각 플러그인별
// Doconut.Viewer.<Capability>.lic 파일을 함께 찾습니다.
builder.Services.AddDoconut();

탐색 디렉터리와 각 디렉터리에서 찾는 파일 이름은 다음과 같습니다:

text
1. {CurrentDirectory}/wwwroot
2. {CurrentDirectory}/wwwroot/lib
3. AppContext.BaseDirectory

Filenames (checked in each directory above, in order):
  Doconut.Viewer.lic                   — 기본 뷰어 라이선스
  Doconut.Viewer.<Capability>.lic      — 플러그인별 라이선스, Doconut.Viewer.lic와 함께

라이선스를 출력 폴더에 복사하기

LicensePath와 자동 검색의 AppContext.BaseDirectory 탐색 모두 .lic 파일이 빌드된 앱 옆에 존재해야 합니다 — 소스 wwwroot에만 있으면 안 됩니다. SDK 자체 테스트 앱은 매 빌드마다 다음 MSBuild 타깃으로 복사합니다:

xml
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
  <ItemGroup>
    <DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
  </ItemGroup>
  <Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
</Target>

.lic 파일을 소스 제어에 포함하지 마세요 — 앱과 함께 배포하거나 비밀 저장소에서 LicenseContent 또는 LicenseStream을 통해 라이선스를 주입하십시오.

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

라이선스가 없으면 예외가 발생하지 않습니다. AddDoconut()는 성공하고 앱이 시작되며 뷰어가 실행되지만 — 모든 페이지에 평가용 워터마크가 표시되고 선택적 기능은 부여되지 않습니다.

찾은 라이선스가 거부되는 경우는 다릅니다. 서명 오류, 변조, 블랙리스트, 혹은 라이선스 버전 창을 벗어난 경우 OpenDocumentAsyncLicenseExceptionLicense.RejectionMessage를 던집니다. 캘린더 기간이 만료된 라이선스는 거부 메시지가 없으며 워터마크 모드로 계속 동작합니다.

플러그인에 필요한 기능

해당 권한이 없는 플러그인을 등록하면 상황이 다릅니다: 라이선스가 없거나, 레거시 TRIAL 파일이 있거나, 해당 기능을 포함하지 않은 유료 라이선스인 경우 AddDoconut()InvalidOperationException을 발생시켜 앱이 시작되지 않습니다. 예를 들어 Converter 기능을 부여받지 않은 상태에서 Converter 플러그인을 등록하면:

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.

메시지는 직접적인 해결책을 알려줍니다: 해당 플러그인에 대한 options.AddPlugin<...>() 호출을 제거하거나, Converter 기능을 포함하는 유료 라이선스 또는 활성 임시/데모(NFR) 라이선스를 설치하십시오. 임시 등록은 만료일 이후에도 남아 있어 이미 구성된 앱이 재시작 시 충돌하지 않고 런타임에 기능을 축소하도록 허용됩니다; 만료되면 해당 기능은 여전히 회수됩니다.

로드된 라이선스 확인

SDK와 동일한 진실의 원천인 IDoconutLicenseService를 사용해 인증된 진단 엔드포인트를 노출하거나 기능 플래그를 구동하십시오. 라이선스 내용이나 키를 반환하지 마세요.

csharp
app.MapGet("/api/doconut/license", (IDoconutLicenseService license) => Results.Ok(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
}));

라이선스는 AddDoconut() 등록 시 읽혀집니다. ResetLicense는 현재 호환성을 위한 속성일 뿐이며 활성 재로드 경로가 없으므로 라이선스 파일을 교체하려면 애플리케이션을 재시작해야 합니다.

문제 해결 매트릭스

증상가능한 원인확인
뷰어는 작동하지만 모든 페이지에 워터마크가 표시됨라이선스가 로드되지 않았거나 라이선스가 기간 만료됨IDoconutLicenseService 해결; 출력 디렉터리와 프로세스 작업 디렉터리 확인
AddDoconut() 플러그인에서 예외 발생라이선스가 해당 플러그인 기능을 부여하지 않음IsCapabilityGranted(...) 확인 및 구매하지 않은 등록 제거
구성된 상대 경로가 로컬에서는 작동하지만 IIS/컨테이너에서는 작동하지 않음프로세스 작업 디렉터리가 변경됨AppContext.BaseDirectory 또는 절대 경로 사용
교체된 .lic 파일이 효과가 없음싱글톤 라이선스 서비스가 이미 생성됨애플리케이션 재시작
OpenDocumentAsyncLicenseException 예외 발생서명, 도메인, 버전 창, 블랙리스트, 또는 플러그인 런타임 게이트가 라이선스를 거부함신뢰할 수 없는 클라이언트에 노출하지 않고 예외/거부 메시지 읽기

다음 단계

  • 라이선스 — 기능, 라이선스 등급, 런타임에 로드된 내용 확인.
  • 문제 해결 — 워터마크, 거부된 라이선스, 기능 오류.

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