Razor Pages、MVC 和最小化 API
查看器不受托管方式限制。您可以在 Razor 视图或静态页面中渲染挂载 div,并从控制器动作、页面处理程序或映射端点打开文档。
问题
大多数文档查看器作为独立服务出现。这意味着第二个部署单元、第二套凭证、文档需要跨越的网络跳转,以及凌晨 2 点还要有人处理的第二件事。
Doconut 是一个库。AddDoconut() 将其加入服务集合;UseDoconut() 将其加入管道。它在您的进程身份下运行,读取您的配置,写入您的日志,并由已有的应用程序部署机制进行部署。
实际结果是授权保持在应有的位置。您在自行的权限检查后调用 OpenDocumentAsync(),查看器只能渲染您决定交给它的内容。
功能
查看器不受托管方式限制。您可以在 Razor 视图或静态页面中渲染挂载 div,并从控制器动作、页面处理程序或映射端点打开文档。
因为端点位于您的管道中,[Authorize] 的行为保持不变。不存在需要联邦的第二身份系统。
文档安全依赖于 ASP.NET 会话状态,这也是为什么必须在 UseDoconut() 之前注册 UseSession()。这意味着查看器对您身份的认知与应用程序相同。
负载均衡器后面的多个节点共享渲染缓存,因此在一个节点打开的会话在后续请求落到其他节点时仍然可用。
IIS、Kestrel,或您自行构建的容器镜像。集成方式在它们之间没有变化,唯一不同的是许可证文件的挂载位置。
使用 Converter 插件,DocumentConverter.ConvertAsync() 在同一进程中运行——无需第二个服务、临时上传或往返。
集成
UserMayRead 和 ResolvePath 是您自己的代码。这正是关键:Doconut 永远不会知道哪些文档存在或谁有权限查看它们。
支持的平台
// 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();详情
是的。两者均受支持,并使用相同的 DI 加中间件架构。如果需要特定版本的细节,分别有专门的页面。
没有,这也是有意为之。集成始终是中间件加 JavaScript 小部件,这使得在 Razor Pages、MVC、Web Forms 和 Blazor 中保持相同的集成方式,而不会被拆分成四种。
通过共享渲染缓存支持 Web 农场和分布式部署。一个节点打开的文档在后续请求落到其他节点时仍可读取。
不需要。渲染是原生的——没有 Office 互操作、无无头 Word,也没有需要维护的 COM 自动化。