ASP.NET Core

三个中间件调用,而非重写

Doconut 的注册方式与 ASP.NET Core 中的其他所有内容相同:在容器中注册为服务,在管道中注册为中间件。它继承您的身份验证、日志记录、依赖注入图以及部署方式,因为它运行在它们内部而不是旁边。

3
需要集成的中间件调用
75
开箱即用的文件扩展名
2
部署目标:Windows,Docker

问题

没人预留的集成成本

大多数文档查看器作为独立服务出现。这意味着第二个部署单元、第二套凭证、文档需要跨越的网络跳转,以及凌晨 2 点还要有人处理的第二件事。

Doconut 是一个库。AddDoconut() 将其加入服务集合;UseDoconut() 将其加入管道。它在您的进程身份下运行,读取您的配置,写入您的日志,并由已有的应用程序部署机制进行部署。

实际结果是授权保持在应有的位置。您在自行的权限检查后调用 OpenDocumentAsync(),查看器只能渲染您决定交给它的内容。

功能

中间件为您提供的功能

Razor Pages、MVC 和最小化 API

查看器不受托管方式限制。您可以在 Razor 视图或静态页面中渲染挂载 div,并从控制器动作、页面处理程序或映射端点打开文档。

您的身份验证,保持不变

因为端点位于您的管道中,[Authorize] 的行为保持不变。不存在需要联邦的第二身份系统。

基于会话的文档安全

文档安全依赖于 ASP.NET 会话状态,这也是为什么必须在 UseDoconut() 之前注册 UseSession()。这意味着查看器对您身份的认知与应用程序相同。

支持 Web 农场

负载均衡器后面的多个节点共享渲染缓存,因此在一个节点打开的会话在后续请求落到其他节点时仍然可用。

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 视图注入 Doconut.Viewer 并输出 ReferenceCss / ReferenceScripts;jQuery 必须在查看器脚本之前加载。
  • 从配置中设置 options.LicensePath,以便将许可证文件作为机密挂载,而不是写入镜像中。

常见问题

它同时支持 .NET 6 和 .NET 8 吗?

是的。两者均受支持,并使用相同的 DI 加中间件架构。如果需要特定版本的细节,分别有专门的页面。

是否有 Razor 组件或标签帮助器?

没有,这也是有意为之。集成始终是中间件加 JavaScript 小部件,这使得在 Razor Pages、MVC、Web Forms 和 Blazor 中保持相同的集成方式,而不会被拆分成四种。

在负载均衡器后它的表现如何?

通过共享渲染缓存支持 Web 农场和分布式部署。一个节点打开的文档在后续请求落到其他节点时仍可读取。

服务器上需要安装 Office 吗?

不需要。渲染是原生的——没有 Office 互操作、无无头 Word,也没有需要维护的 COM 自动化。

在您自己的文档上试用

临时许可证的申请只需几分钟,并且完全在您自己的机器上运行。重要的文件是那些已经导致您当前查看器出现问题的文件。