라이선스
기능, 라이선스 티어 및 라이선스 서비스
이 페이지는 라이선스가 Doconut의 동작을 어떻게 형성하는지에 대한 런타임 레퍼런스입니다. 각 라이선스 상태가 허용하는 내용, 기능이 부여되는 방식, 그리고 코드에서 이를 모두 검사하는 방법을 설명합니다. (라이선스를 로드하는 방법은 라이선스 설정을 참고하십시오.)
라이선스 상태 및 동작
| 상태 | 문서 열기 가능? | 워터마크 | 기능 |
|---|---|---|---|
| 전체 (유료) 라이선스 (구독/업데이트 기간 내) | 예 | 없음 | 구매된 항목 (Has* 플래그) |
| 임시 라이선스 (Developer/NFR — 평가 라이선스, 만료일 이전) | 예 | 없음 | 전체 — 일괄 부여 (평가 퍼널) |
| 만료 (만료일이 지난 임시 라이선스 또는 갱신일이 지난 유료 구독) | 예 | 평가 워터마크 | 부여된 기능 없음 |
| 라이선스 파일 없음 | 예 | 평가 워터마크 | 부여된 기능 없음 |
| 발견되었지만 거부됨 (잘못된 서명, 변조, 블랙리스트, 또는 라이선스 버전 윈도우보다 최신 빌드) | 아니오 — 모든 열기에서 LicenseException | — | — |
두 가지 중요한 점:
- 누락된 라이선스는 임시 라이선스가 아닙니다. 라이선스 파일이 없으면 페이지에 워터마크가 표시되고 기능(검색, 주석, 플러그인)이 활성화되지 않습니다. 전체 기능을 갖춘 워터마크 없는 경험을 위해서는 실제 임시 라이선스가 필요합니다 (구매하기).
- 거부된 라이선스만 열기를 차단합니다. 캘린더/구독 만료는 워터마크가 있는 렌더링으로 낮아지지만, 라이선스 버전 윈도우보다 새로운 빌드를 배포하면 거부되고
LicenseException과 함께 빠르게 실패합니다. 따라서 배포 시에 이를 포착할 수 있으며, 워터마크된 출력을 조용히 배포하는 것이 아닙니다. 해당 예외(OpenDocumentAsync에서 발생)는License.RejectionMessage의 이유를 포함합니다.
기능
Doconut는 기능을 통해 선택적 기능을 제어합니다. 현재는 선택 가능한 Converter와 DICOM 플러그인 및 내장 Search와 Annotation 기능이며, 각각 라이선스에 의해 부여됩니다. 기본 뷰어는 기능이 아니라 전제 조건이며, IsViewerLicensed로 표시됩니다:
bool viewerLicensed = lic.IsViewerLicensed; // 비TRIAL 라이선스가 존재하고 이 빌드 버전을 포함함전체 파이프라인이 사용하는 단일 게이트는 IsCapabilityGranted입니다:
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);그 로직은 구현에서 그대로 가져온 것입니다: 활성(만료되지 않은) 임시 라이선스는 모든 기능을 부여합니다 — 아직 전용 구매 플래그가 없는 기능도 포함합니다; 실제 구매된 라이선스는 정확히 Has* 플래그만 부여하며 매핑되지 않은 항목에 대해서는 기본 거부합니다. (레거시 TRIAL 유형 파일은 권한이 아니며 라이선스가 없는 것으로 처리됩니다: 워터마크가 적용되고, 아무 것도 부여되지 않음.)
임시 라이선스
임시(Developer/NFR) 라이선스는 ExpiryNote 태그로 표시되며 강제 만료 날짜를 가집니다:
| 멤버 | 의미 |
|---|---|
IsTemporary | ExpiryNote 태그가 존재함 (탐지는 태그 존재 여부로 이루어지며, 메모 텍스트와 일치시키지 않음, 동적임) |
ExpiryNote | 라이선스에 포함된 정보 텍스트 |
LicenseExpiry | 강제 만료 날짜 (DateTime?) |
만료 의미는 티어에 따라 다릅니다: 임시 라이선스는 LicenseExpiry 날짜만 기준으로 만료됩니다(구독 윈도우는 무시됩니다; 날짜가 없는 임시 라이선스는 만료된 것으로 간주되어 안전하게 처리됩니다). 다른 모든 라이선스는 구독/업데이트 윈도우 날짜에 따라 만료됩니다.
IDoconutLicenseService 레퍼런스
IDoconutLicenseService(네임스페이스 Doconut.Core.Interfaces)를 DoconutHost.Services에서 해결합니다. 이는 싱글톤이며, 라이선스는 DoconutHost.Initialize에서 한 번 파싱됩니다:
| 멤버 | 의미 |
|---|---|
License | 전체 DoconutLicenseInfo 스냅샷 (아래) |
IsTrial | 레거시 TRIAL 유형 파일 (라이선스가 없는 것으로 처리 — 권한이 아님) |
IsTemporary / ExpiryNote / LicenseExpiry | 임시 라이선스 표시자 |
IsExpired | 위 티어 규칙에 따라 만료됨 |
IsVersionValid | 이 빌드가 라이선스 지원 윈도우 내에 있음 |
IsViewerLicensed | TRIAL이 아닌 파일이 발견되고 버전이 포함 — 기본 전제 조건 |
IsCapabilityGranted(cap) | 단일 기능 게이트 |
HasSearch HasAnnotation HasConverter HasDicom | 각 기능별 구매 플래그에 따라 제공 — 임시 라이선스를 고려한 답변은 IsCapabilityGranted 사용 |
IsValidForDomain(host) | 호스트 적용 범위; V4 라이선스는 와일드카드 *.* 사용 |
LicenseRejectionReason | 비어 있지 않음 ⇒ 이 메시지로 열기가 차단됨 |
DoconutLicenseInfo는 관리자 패널을 위한 표시 친화적인 스냅샷을 제공합니다: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, Has* 플래그, 임시 라이선스 필드, 그리고 RejectionMessage.
// GET /Features - SDK가 사용하는 동일한 진실 소스로부터 UI에 기능 플래그 적용
public ActionResult Index()
{
var lic = Doconut.DoconutHost.Services.GetRequiredService<IDoconutLicenseService>();
return Json(new
{
viewer = lic.IsViewerLicensed || lic.IsTemporary,
search = lic.IsCapabilityGranted(LicenseCapability.Search),
annotation = lic.IsCapabilityGranted(LicenseCapability.Annotation),
conversion = lic.HasConverter,
dicom = lic.HasDicom,
}, JsonRequestBehavior.AllowGet);
}상태 확인
Doconut는 라이선스 상태를 보고하는 "doconut" 헬스 체크를 등록합니다. 클래식 ASP.NET에는 자체 헬스 엔드포인트가 없으므로 컨트롤러에서 이를 노출합니다:
// GET /Health - Doconut가 라이선스 상태를 보고하는 "doconut" 헬스 체크를 등록합니다:
// Healthy (유효), Degraded (시험판 또는 라이선스 파일 없음), Unhealthy (만료).
public async Task<ActionResult> Index()
{
var health = Doconut.DoconutHost.Services.GetRequiredService<HealthCheckService>();
HealthReport report = await health.CheckHealthAsync();
Response.StatusCode = report.Status == HealthStatus.Unhealthy ? 503 : 200;
return Content(report.Status.ToString(), "text/plain");
}이를 모니터링에 연결하면 만료되는 구독이 지원 티켓 대신 알림이 됩니다. 상태 값은 DoconutHost를 참조하십시오.
버전 업그레이드
라이선스는 버전 윈도우를 포함합니다. NuGet 패키지를 해당 윈도우보다 새로운 빌드로 업데이트하면 이 빌드에 대한 라이선스가 무효가 됩니다. IsVersionValid가 false가 되고 LicenseException과 함께 열기가 차단됩니다(License.RejectionMessage에 이유가 포함됨). 이는 의도적으로 빠르게 실패하도록 설계된 것으로, 오래되거나 라이선스가 없는 빌드가 배포 시에 포착되어 프로덕션 출력에 워터마크가 조용히 적용되는 것을 방지합니다. 구독을 갱신하고 wwwroot의 .lic 파일을 교체한 뒤, 애플리케이션 풀을 재시작하여 DoconutHost.Initialize가 새 라이선스를 로드하도록 합니다.
이 페이지가 도움이 되었나요?