Apache Arrow Flight C#连接Dremio SSL握手失败问题求助
问题排查与解决方案
问题根因
- 语法错误:原代码中
client.ListActions()的返回值未赋值给actions变量,直接调用actions.ResponseStream属于未定义变量错误。 - SSL握手错误核心原因:默认Dremio的Flight服务(端口32010)未开启SSL加密,你代码中强制使用
SslCredentials走SSL加密通道,和服务端明文传输协议不匹配,导致握手失败。如果你的Dremio确实配置了SSL,则大概率是自签证书不受客户端信任、访问地址与证书域名不匹配导致。
解决方案
场景1:Dremio未开启SSL(绝大多数测试/内部部署场景)
直接使用明文通道创建连接,修正后的代码如下:
// 基础认证信息编码 string encoded = Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes("你的Dremio用户名" + ":" + "你的Dremio密码")); var credentials = CallCredentials.FromInterceptor((context, metadata) => { metadata.Add("Authorization", "Basic " + encoded); return Task.CompletedTask; }); // 注意:未开启SSL时地址前缀为http,端口为默认32010,使用InsecureChannelCredentials GrpcChannel channel = GrpcChannel.ForAddress("http://你的Dremio服务地址:32010", new GrpcChannelOptions { Credentials = ChannelCredentials.Create(new InsecureChannelCredentials(), credentials) }); FlightClient client = new FlightClient(channel); // 修正:接收ListActions的返回值,异步调用加await var actions = await client.ListActions(); while (await actions.ResponseStream.MoveNext(default)) { Console.WriteLine(actions.ResponseStream.Current.Type); }
场景2:Dremio已开启SSL
如果确认服务端开启了SSL,需要处理证书信任问题,添加自定义证书验证逻辑,代码修改如下:
string encoded = Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes("你的Dremio用户名" + ":" + "你的Dremio密码")); var credentials = CallCredentials.FromInterceptor((context, metadata) => { metadata.Add("Authorization", "Basic " + encoded); return Task.CompletedTask; }); // 自定义HttpHandler跳过证书验证(仅测试环境使用,生产环境建议配置信任证书) var httpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true }; // 注意地址前缀为https,端口为你配置的SSL Flight端口 GrpcChannel channel = GrpcChannel.ForAddress("https://你的Dremio服务地址:SSL端口", new GrpcChannelOptions { Credentials = ChannelCredentials.Create(new SslCredentials(), credentials), HttpHandler = httpHandler }); FlightClient client = new FlightClient(channel); var actions = await client.ListActions(); while (await actions.ResponseStream.MoveNext(default)) { Console.WriteLine(actions.ResponseStream.Current.Type); }
额外验证点
- 确认Dremio服务的32010端口(或自定义Flight端口)已开放,没有防火墙拦截。
- 确认使用的Dremio账号有Flight访问权限。
内容的提问来源于stack exchange,提问作者Gandhi
相关产品推荐
相关产品推荐

