ASP.NET Core

Три вызова middleware, а не переписывание

Doconut регистрируется так же, как и всё остальное в ASP.NET Core: как сервис в контейнере и middleware в конвейере. Он наследует вашу аутентификацию, логирование, граф DI и процесс развертывания, потому что работает внутри них, а не рядом с ними.

3
вызова middleware для интеграции
75
расширений файлов из коробки
2
цели развертывания: Windows, Docker

Проблема

Налог на интеграцию, который никто не учитывает в бюджете

Большинство просмотрщиков документов поставляются как отдельный сервис. Это означает второй блок развертывания, второй набор учетных данных, сетевой переход, через который теперь проходят ваши документы, и еще одну проблему, о которой придется писать кому‑то в 2 часа ночи.

Doconut — это библиотека. AddDoconut() помещает её в вашу коллекцию сервисов; UseDoconut() добавляет её в ваш конвейер. Она работает под идентичностью вашего процесса, видит вашу конфигурацию, пишет в ваш логгер и разворачивается тем, кто уже разворачивает ваше приложение.

Практический результат заключается в том, что авторизация остаётся там, где ей место. Вы вызываете OpenDocumentAsync() после собственной проверки прав, и просмотрщик может отобразить только то, что вы ему передали.

Возможности

Что дает вам middleware

Razor Pages, MVC и минимальные API

Просмотрщик не привязан к стилю хостинга. Отрендерьте контейнерный div из Razor‑view или статической страницы и откройте документ из действия контроллера, обработчика страницы или сопоставленного эндпоинта.

Ваша аутентификация без изменений

Поскольку эндпоинты находятся в вашем конвейере, [Authorize] работает так же, как всегда. Нет второй системы идентификации для федерации.

Безопасность документов на основе сессии

Безопасность документов опирается на состояние сессии ASP.NET, поэтому UseSession() должен быть зарегистрирован до UseDoconut(). Это означает, что представление просмотрщика о том, кто вы, совпадает с представлением приложения.

Готово для веб‑фермы

Несколько узлов за балансировщиком нагрузки делят кэш рендеринга, поэтому сессия, открытая на одном узле, продолжает работать, когда следующий запрос попадает на другой.

Windows или Docker

IIS, Kestrel или образ контейнера, который вы собираете сами. Ничего в интеграции не меняется между ними, кроме места монтирования файла лицензии.

Конверсия в том же конвейере

С плагином Converter, DocumentConverter.ConvertAsync() выполняется в том же процессе — без второго сервиса, без временной загрузки, без обратного пути.

Интеграция

Регистрация и открытый эндпоинт

UserMayRead и ResolvePath — ваш собственный код. В этом суть: Doconut никогда не узнает, какие документы существуют и кто имеет право их видеть.

Поддерживаемые платформы

Razor PagesMVCMinimal APIs.NET 8.NET 6WindowsDocker
csharp
// Program.cs
builder.Services.AddDoconut(options =>
{
    options.LicensePath = "Doconut.Viewer.lic";
});
builder.Services.AddSession(); // document security rides on session state

var app = builder.Build();

app.UseSession();          // call UseSession() before UseDoconut()
app.UseDoconutResources(); // must be registered before UseDoconut()
app.UseDoconut();

// Open the document server-side, behind your own authorization
app.MapPost("/api/open", async (Viewer viewer, HttpContext ctx, string documentId) =>
{
    if (!await ctx.UserMayRead(documentId))
        return Results.Forbid();

    // The token is opaque — hand it to the widget, never log or persist it.
    string token = await viewer.OpenDocumentAsync(ResolvePath(documentId));
    return Results.Ok(new { token });
}).RequireAuthorization();

Подробности

Порядок регистрации и подводные камни

  • UseSession() должен быть вызван до UseDoconut(). Безопасность документов зависит от него.
  • UseDoconutResources() должен быть вызван до UseDoconut() и должен находиться за той же аутентификацией, что и остальное приложение.
  • Razor‑view внедряет Doconut.Viewer и выводит ReferenceCss / ReferenceScripts; jQuery должен загрузиться до скриптов просмотрщика.
  • Установите options.LicensePath из конфигурации, чтобы файл лицензии можно было смонтировать как секрет, а не включать в образ.

Часто задаваемые вопросы

Работает ли он с .NET 6 так же, как и с .NET 8?

Да. Оба поддерживаются и используют одну и ту же архитектуру DI плюс middleware. Для каждой версии есть отдельные страницы, если нужны детали, специфичные для версии.

Есть ли Razor‑компонент или tag helper?

Нет, и это намеренно. Интеграция всегда представляет собой middleware плюс JavaScript‑виджет, что сохраняет единый способ интеграции для Razor Pages, MVC, Web Forms и Blazor, вместо того чтобы фрагментировать его на четыре части.

Как он ведёт себя за балансировщиком нагрузки?

Веб‑ферма и распределённое развертывание поддерживаются через общий кэш рендеринга. Документ, открытый на одном узле, остаётся читаемым, когда последующие запросы попадают на другой.

Нужен ли Office, установленный на сервере?

Нет. Рендеринг нативный — нет взаимодействия с Office, нет безголового Word и нет COM‑автоматизации, требующей наблюдения.

Попробуйте с вашими собственными документами

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