Flutter移动端调用C#编写的gRPC服务抛出UNAVAILABLE错误如何解决?
问题原因
ClientChannel构造参数传入的地址携带了https://协议前缀,gRPC客户端会将整段字符串当做主机名执行DNS解析,无法匹配到对应的IP地址,因此抛出主机查找失败的错误。
解决方案
- 第一步:移除地址中的协议前缀,仅保留域名部分,参考修改后的代码:
Future<void> login(email, password) async { // 仅保留域名,去掉https://前缀 final channel = ClientChannel('abc.service.domain.com'); final stub = AuthenticationClient(channel); var request = LoginRequest() ..email = email ..password = password; var response = await stub.login(request); print(response); // 用完建议关闭通道释放资源 await channel.shutdown(); }
- 如果你的gRPC服务使用非443端口,需要显式指定端口,默认TLS连接配置参考如下:
final channel = ClientChannel( 'abc.service.domain.com', port: 50051, // 替换为你的服务实际暴露端口 options: const ChannelOptions(credentials: ChannelCredentials.secure()), );
- 如果服务使用自签名证书,需要手动传入证书配置:
// 提前将证书文件放入项目assets目录,在pubspec.yaml中完成资源声明 final cert = await rootBundle.load('assets/service_cert.crt'); final channel = ClientChannel( 'abc.service.domain.com', port: 50051, options: ChannelOptions( credentials: ChannelCredentials.secure( certificates: cert.buffer.asUint8List(), ), ), );
内容的提问来源于stack exchange,提问作者DisplayName
相关产品推荐
相关产品推荐

