Blazor Server 与 WebAssembly
渲染始终在服务器端进行。Server 模式下调用直接;在 WebAssembly 中,你将打开调用暴露为最小 API 端点,并将返回的令牌交给部件。两者只需几行代码。
问题
客户端路径意味着将渲染引擎运送到浏览器中。在 Blazor WebAssembly 中,这直接增加了下载大小,而且它仅支持 PDF——一旦有人上传 DOCX 或 XLSX,你就回到原点。
iframe 到 Office 的路径意味着你的文档要经过他人的基础设施,这需要与你的安全团队进行一次你可能不想重复的沟通。
Doconut 采用第三种路径。文件由你自己的服务器栅格化为页面图像,Blazor 只需托管一个 div。你的组件树永远不会重新渲染它不拥有的查看器,差异引擎也无可争执。
功能
渲染始终在服务器端进行。Server 模式下调用直接;在 WebAssembly 中,你将打开调用暴露为最小 API 端点,并将返回的令牌交给部件。两者只需几行代码。
在首次渲染后通过标准 JS 互操作钩子初始化部件一次。由于 Blazor 从不拥有查看器的内部 DOM,后续的重新渲染不会触及它。
交互式 Server、交互式 WebAssembly 或 Auto。查看器由不透明令牌驱动,而非组件状态,因此切换渲染模式不会改变集成方式。
同一组件可打开 PDF、DOCX、XLSX、PPTX、DWG、MSG 以及目录中的其他格式。你只需编写一个查看器页面,而不是每种文件类型各一个。
导航 UI 随部件提供。你只需接线一个查看器,而不是从画布和页码输入自行构建。
除渲染后的页面图像外,未向浏览器传输任何内容,这在 WebAssembly 中比人们预期的更重要——毕竟客户端是完全可检查的。
集成
doconutHost.mount 是几行你自己的 JavaScript,调用 $('#div_ctlDoc').docViewer({ ... }) 然后 .View(token)。将其置于 Blazor 之外是有意为之——部件的 DOM 不应成为渲染器尝试调和的对象。
支持的平台
// Program.cs — order matters
builder.Services.AddDoconut(options =>
{
options.LicensePath = "Doconut.Viewer.lic";
});
builder.Services.AddSession();
app.UseSession(); // before UseDoconut()
app.UseDoconutResources(); // before UseDoconut()
app.UseDoconut();
// Viewer.razor — open server-side, hand the token to the widget
@inject Doconut.Viewer Viewer
@inject IJSRuntime JS
<div id="divDocViewer"><div id="div_ctlDoc"></div></div>
@code {
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (!firstRender) return;
// Authorize first — the viewer renders whatever you hand it.
string token = await Viewer.OpenDocumentAsync("wwwroot/files/Sample.pdf");
await JS.InvokeVoidAsync("doconutHost.mount", token);
}
}详情
两者皆可。渲染始终在服务器端进行,因此在 WebAssembly 中只需添加一个调用 OpenDocumentAsync 并返回令牌的端点。客户端从不解析文档,这正是 WASM 负载保持不变的原因。
不会,只要你挂载到 Blazor 视为叶子的元素。渲染一个空的 div,让部件通过互操作填充——差异引擎没有子元素需要调和。
不需要。一个页面即可处理整个目录。格式是从你打开的文档中检测到的,而不是事先由你选择的。