Настройка лицензии

Где Doconut ищет ваш файл лицензии под IIS

Без лицензии Doconut всё равно отображает документы — каждая страница просто содержит водяной знак оценки. На этой странице рассматриваются четыре способа предоставить лицензию в Global.asax, где Doconut ищет её, если вы не указываете никакую, и что происходит, когда лицензия плагина отсутствует.

Четыре способа предоставить лицензию

Существует три явных источника в DoconutOptions — путь к файлу, поток или необработанное содержимое — плюс автоматическое обнаружение, когда ни один из них не задан. Все они читаются один раз, в DoconutHost.Initialize. Когда задано более одного, порядок приоритетов точен:

LicenseStream побеждает LicenseContent, побеждает 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
// Приоритет: LicenseStream > LicenseContent > LicensePath > авто-поиск.
Doconut.DoconutHost.Initialize(options =>
{
    options.LicenseStream = licenseStream;
});

По содержимому

LicenseContent принимает сам текст лицензии — из переменной окружения, базы данных или секретного хранилища — поэтому файл лицензии не требуется размещать вместе с сайтом.

csharp
// XML лицензии из базы данных, переменной окружения или хранилища секретов -
// нет файла на диске. Превзойдён только LicenseStream.
Doconut.DoconutHost.Initialize(options =>
{
    options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});

Автоматическое обнаружение

Не задайте ни один из трёх, и Doconut самостоятельно ищет лицензию:

csharp
// Ничего не настраивая, Doconut ищет лицензию самостоятельно в следующем порядке:
//   1. {CurrentDirectory}\wwwroot
//   2. {AppContext.BaseDirectory}\wwwroot   (в IIS: корневая папка сайта)
// Сначала ищет Doconut.lic, затем Doconut.Viewer.lic, плюс любые per-plugin
// файлы Doconut.Viewer.<Capability>.lic рядом с ним.
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

В проекте держите wwwroot\*.lic рядом с Web.config и разверните папку вместе с сайтом. Никакой шаг сборки не требуется для копирования её куда-либо. .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 (журнал Приложений, источник 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Лицензия найдена, но отклоненаПрочитайте сообщение об исключении; не показывайте его недоверенным клиентам

Следующие шаги

Была ли эта страница полезной?