如何区分独立CSB应用与托管模式CSB应用
区分Blazor WASM托管/独立模式的最简方案
这里提供两类适配不同场景的方案,都可以直接满足你判断调用能力和展示标识的需求:
方案1:条件编译(首推,零运行时开销)
适用于两种模式分开打包的场景,完全没有多余性能损耗,打包时无关代码会自动裁剪:
- 右键你的Blazor WASM项目,选择「属性」→「生成」→「常规」→「条件编译符号」,仅在托管模式对应的生成配置里新增
HOSTED自定义符号,不要修改独立模式的生成配置。 - 代码里直接用预编译指令做判断即可:
public static class AppRunMode { // 直接判断是否为托管模式 public static bool IsHosted => #if HOSTED true; #else false; #endif // 直接返回界面要展示的标识文本 public static string DisplayTag => IsHosted ? "托管应用" : "独立应用"; }
方案2:运行时动态判断(适用于同一份WASM包兼容两种部署模式的场景)
如果你的WASM包不会分开编译,要同时适配两种部署模式,优先用全局变量嵌入方案,无额外网络开销:
- 托管模式的后端在返回的入口
index.html里嵌入全局JS变量:
<script> window.appRuntimeInfo = { isHosted: true }; </script>
- 独立模式的
index.html里把这个变量的值设为false,或者不做定义。 - WASM启动时通过JS互操作读取变量值,存到全局状态即可:
var jsRuntime = services.BuildServiceProvider().GetRequiredService<IJSRuntime>(); bool isHosted = await jsRuntime.InvokeAsync<bool?>("appRuntimeInfo?.isHosted") ?? false;
如果不想修改HTML文件,也可以在启动时发起一次轻量GET请求,检测后端是否存在你预设的专属无鉴权端点(比如/api/app-mode),能正常返回预期结果就判定为托管模式,404/超时就判定为独立模式。
注意:不要直接通过URL Origin识别模式,会出现用户把独立模式部署在和后端同域名下的误判情况。
需求落地方式
- 判断能否发起服务端REST调用:直接读
AppRunMode.IsHosted的值即可,返回true则允许调用,返回false直接禁用相关功能或展示友好提示。 - 界面展示标识:直接把
AppRunMode.DisplayTag绑定到对应的UI组件上即可。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

