Blazor混合应用本质是共享代码+分离宿主,需通过Shared类库共用组件与逻辑,WASM与Server项目独立部署并适配差异,不可单项目切换渲染模式。

Blazor WebAssembly 和 Blazor Server 混合应用不是官方直接支持的“单项目双托管模式”,但可以通过合理架构设计,在同一解决方案中**共用组件、业务逻辑和 API 层**,让不同页面或功能模块分别运行在 WASM 或 Server 模式下——本质是“共享代码 + 分离宿主”,而非一个页面同时跑两种模型。
核心思路:共享类库 + 独立宿主项目
不要试图在一个项目里切换渲染模式。正确做法是:
- 创建一个 Shared 类库(.NET Standard 或 .NET 6+),存放所有可复用内容:Razor 组件(.razor)、服务接口与实现(需注意依赖注入差异)、数据模型、工具方法等
- 新建两个独立的 Blazor 项目:Blazor WebAssembly App(带托管后端) 和 Blazor Server App
- 两个宿主项目都引用 Shared 类库,并按各自模型适配:WASM 项目调用 HttpClient 访问 API,Server 项目直接注入服务或调用本地逻辑
组件复用的关键注意事项
不是所有组件都能无修改共用。需主动处理以下差异:
-
JS 互操作:WASM 中
IJSRuntime.InvokeAsync是异步且网络往返的;Server 中是同步调用(IJSRuntime.InvokeVoidAsync也走 SignalR)。建议封装抽象层,如定义IJsHelper接口,在 Shared 中使用,由各宿主项目提供具体实现 -
状态管理与生命周期:Server 模式下组件实例长期存活,WASM 中可能随页面刷新重置。避免在组件内缓存跨请求状态,改用
localStorage(WASM)或CascadingParameter+ 父组件管理(Server) -
认证与授权:WASM 通常用 JWT 存 localStorage,Server 用 Cookie。Shared 中的
[Authorize]可共用,但登录逻辑、Token 获取/刷新必须分开实现
如何让部分路由走 WASM、部分走 Server?
不能靠路由配置自动切换,但可通过以下方式“模拟混合”:
标签: js 前端 nginx cookie cad seo app 工具 后端 proxy 路由 .net red
还木有评论哦,快来抢沙发吧~