Uno Platform WebAssembly创建GrpcChannel报NullReferenceException异常
问题背景
我正在开发使用gRPC-Web的Uno Platform示例项目,参考相关教程先搭建了集成gRPC-Web天气服务的Blazor应用,又参照官方示例新增了计数器服务,确认Blazor端所有功能运行正常后,新增Uno Platform WebAssembly应用替换原有Blazor客户端。
故障现象
创建GrpcChannel实例时,应用抛出System.NullReferenceException空引用异常,使用的通道创建代码和Blazor端完全一致,代码片段如下:
var baseUri = "https://localhost:44366"; var channel = GrpcChannel.ForAddress(baseUri, new GrpcChannelOptions());
解决方案
该空引用是Uno Platform WebAssembly环境未内置gRPC-Web默认适配层导致的:Blazor WebAssembly默认注入了gRPC-Web专用的HttpHandler配置,Uno WASM没有该默认逻辑,直接初始化空配置的GrpcChannelOptions就会触发空引用,按以下步骤修复即可:
- 先核对项目依赖:给Uno WASM项目单独安装
Grpc.Net.Client.Web稳定版NuGet包,不要仅依赖共享项目的包引用,同时将Uno.Wasm.Bootstrap升级到3.10及以上版本,避免低版本的HttpHandler兼容性问题。 - 显式指定gRPC-Web专用处理器初始化通道,替换原有代码为:
var baseUri = "https://localhost:44366"; var httpHandler = new GrpcWebHandler(GrpcWebMode.GrpcWebText, new HttpClientHandler()); var channel = GrpcChannel.ForAddress(baseUri, new GrpcChannelOptions { HttpHandler = httpHandler }); - 本地调试场景下,在Uno WASM项目的启动入口添加开发环境配置,规避本地HTTPS证书校验异常触发的隐式空引用(生产环境务必移除该配置):
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false); - 检查IL裁剪配置,在Uno WASM项目文件中添加gRPC相关程序集的保留规则,防止发布时Linker误删依赖类型:
<ItemGroup> <TrimmerRootAssembly Include="Grpc.Net.Client" /> <TrimmerRootAssembly Include="Grpc.Net.Client.Web" /> <TrimmerRootAssembly Include="Google.Protobuf" /> </ItemGroup>
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

