라이선스

기능, 라이선스 등급 및 라이선스 서비스

이 페이지는 라이선스가 Doconut의 동작을 어떻게 형성하는지에 대한 런타임 레퍼런스입니다: 각 라이선스 상태가 허용하는 것, 기능이 부여되는 방식, 그리고 코드에서 이를 모두 검사하는 방법. (라이선스를 로드하는 방법은 Getting Started → License Setup을 참조하십시오.)

라이선스 상태와 그 역할

상태문서 열기?워터마크기능
Full (paid) license (구독/업데이트 기간 내)없음구매된 항목 (Has* 플래그)
Temporary license (Developer/NFR — 평가 라이선스, 만료일 이전)없음All — 전체 부여 (평가 퍼널)
Expired (만료일이 지난 임시 라이선스 또는 갱신일이 지난 유료 구독)평가 워터마크부여되지 않음
No license file at all평가 워터마크부여되지 않음
Found but rejected (잘못된 서명, 변조, 블랙리스트, 또는 라이선스 버전 윈도우보다 최신 빌드)아니오 — LicenseException 매 열기마다 발생

내부화할 가치가 있는 두 가지 결과:

  • 누락된 라이선스는 임시 라이선스가 아닙니다. 라이선스 파일이 없으면 페이지에 워터마크가 표시되고 기능(검색, 주석, 플러그인)이 활성화되지 않습니다. 전체 기능을 갖춘 워터마크 없는 경험을 위해서는 실제 Temporary license가 필요합니다 (구매하기).
  • 거부된 라이선스만 열기를 차단합니다. 캘린더/구독 만료는 워터마크가 적용된 렌더링으로 낮아지지만, 빌드가 라이선스 버전 윈도우보다 새로운 경우는 거부되고 LicenseException과 함께 빠르게 실패합니다. 따라서 배포 시에 이를 포착할 수 있으며, 워터마크가 적용된 출력을 조용히 배포하는 것이 아닙니다. 해당 예외(OpenDocumentAsync에서 발생)는 License.RejectionMessage의 이유를 포함합니다.

기능

Doconut는 기능을 통해 선택적 기능을 제어합니다. 현재는 선택 가능한 ConverterDICOM 플러그인, 그리고 내장된 SearchAnnotation 기능이 있으며, 각각 라이선스에 의해 부여됩니다. 기본 뷰어는 기능이 아니라 전제 조건이며, IsViewerLicensed로 표시됩니다:

csharp
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's version

전체 파이프라인이 사용하는 단일 게이트는 IsCapabilityGranted입니다:

csharp
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);

그 로직은 구현에서 그대로 가져온 것입니다: 활성(만료되지 않은) Temporary 라이선스는 모든 기능을 부여합니다 — 아직 전용 구매 플래그가 없는 기능도 포함합니다; 실제 구매된 라이선스는 정확히 자신의 Has* 플래그만 부여하며, 매핑되지 않은 모든 항목에 대해 기본 거부합니다. (레거시 TRIAL 유형 파일은 권한이 아닙니다 — 라이선스가 없는 것으로 처리되어 워터마크가 적용되고 아무 것도 부여되지 않습니다.)

임시 라이선스

임시(Developer/NFR) 라이선스는 ExpiryNote 태그로 표시되며 강제 만료 날짜를 가집니다:

멤버의미
IsTemporaryExpiryNote 태그가 존재함 (탐지는 태그 존재 여부로 이루어지며, 메모 텍스트와 일치시키지 않음 — 동적입니다)
ExpiryNote라이선스에 포함된 정보 텍스트
LicenseExpiry강제 만료 날짜 (DateTime?)

만료 의미는 등급에 따라 다릅니다: 임시 라이선스는 LicenseExpiry 날짜만 기준으로 만료됩니다(구독 윈도우는 무시됩니다; 날짜가 없는 임시 라이선스는 만료된 것으로 처리되어 안전하게 동작합니다). 다른 모든 라이선스는 구독/업데이트 윈도우 날짜에 따라 만료됩니다.

IDoconutLicenseService 레퍼런스

IDoconutLicenseService를 주입합니다 (네임스페이스 Doconut.Core.Interfaces; 싱글톤으로 등록 — 라이선스는 시작 시 한 번 파싱됩니다):

멤버의미
License전체 DoconutLicenseInfo 스냅샷 (아래 참고)
IsTrial레거시 TRIAL 유형 파일 (라이선스가 없는 것으로 처리 — 권한이 아님)
IsTemporary / ExpiryNote / LicenseExpiry임시 라이선스 표시자
IsExpired위 등급 규칙에 따라 만료됨
IsVersionValid이 빌드가 라이선스 지원 윈도우 내에 있음
IsViewerLicensedTRIAL이 아닌 파일이 발견되고 버전이 포함 — 기본 전제 조건
IsCapabilityGranted(cap)단일 기능 게이트
HasSearch HasAnnotation HasConverter HasDicom각 기능별 구매 플래그에 따라 제공 — 임시 라이선스를 고려한 답변은 IsCapabilityGranted 사용
IsValidForDomain(host)호스트 적용 범위; V4 라이선스는 와일드카드 *.* 사용
LicenseRejectionReason비어 있지 않음 ⇒ 이 메시지와 함께 열기가 차단됨

DoconutLicenseInfo는 관리자 패널을 위한 표시 친화적인 스냅샷을 제공합니다: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, Has* 플래그, 임시 라이선스 필드 및 RejectionMessage.

csharp
// Feature-flag your UI from the same source of truth the SDK uses
app.MapGet("/api/features", (IDoconutLicenseService lic) => Results.Ok(new
{
    viewer     = lic.IsViewerLicensed || lic.IsTemporary,
    search     = lic.IsCapabilityGranted(LicenseCapability.Search),
    annotation = lic.IsCapabilityGranted(LicenseCapability.Annotation),
    conversion = lic.HasConverter,
    dicom      = lic.HasDicom,
}));

헬스 체크

AddDoconut()는 표준 ASP.NET Core 메커니즘을 통해 라이선스/만료 상태를 보고하는 "doconut" 헬스 체크를 등록합니다:

csharp
app.MapHealthChecks("/health");

이를 모니터링에 연결하면 만료되는 구독이 지원 티켓 대신 알림으로 전환됩니다.

버전 업그레이드

라이선스는 버전 윈도우를 포함합니다. NuGet 패키지를 해당 윈도우보다 새로운 빌드로 업데이트하면 이 빌드에 대해 라이선스가 무효화됩니다: IsVersionValidfalse가 되고 LicenseException과 함께 열기가 차단됩니다(License.RejectionMessage에 이유가 있음) — 의도적으로 빠르게 실패하도록 하여, 오래되었거나 라이선스가 없는 빌드가 배포 시에 포착되고 프로덕션 출력에 조용히 워터마크가 적용되는 것을 방지합니다. 구독을 갱신하고 .lic 파일을 교체한 뒤 애플리케이션을 재시작하면 AddDoconut()가 새 라이선스를 로드합니다.

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