Google.Cloud.Translate.V3调用报GRPC Failed to pick subchannel错误排查求助
问题根因定位
两个报错本质都是代理配置不生效导致的连接失败,curl/gcloud能正常调用是因为这类工具默认会主动读取系统/环境变量的代理规则,而你用到的两个客户端(gRPC官方SDK、HttpWebRequest)都没有正确加载代理配置。
排查&解决步骤
1. 优先修复Google.Cloud.Translate.V3 gRPC SDK的代理配置
Grpc.Core默认不会自动加载http_proxy/https_proxy环境变量,需要手动给Channel配置代理参数,代码修改如下:
// 手动构造带代理配置的Channel var channelOptions = new List<ChannelOption> { new ChannelOption("grpc.http_proxy", "你的代理地址:端口"), // 如果代理需要认证,加下面两行 new ChannelOption("grpc.http_proxy_user", "代理用户名"), new ChannelOption("grpc.http_proxy_pass", "代理密码") }; // 构造TranslationServiceClient的时候指定自定义Channel var builder = new TranslationServiceClientBuilder { ChannelOptions = channelOptions, // 如果你用服务账号密钥的话这里加上CredentialsPath = "你的密钥文件路径" }; TranslationServiceClient client = builder.Build(); // 后面的请求逻辑和原来一致
配置完成后先测试gRPC调用是否能正常返回,优先用官方SDK避免自己封装HTTP请求的鉴权、参数兼容问题。
2. 如果要使用自行封装的HTTP请求方案,需要显式给HttpWebRequest配置代理
HttpWebRequest默认不会自动使用系统代理,也不会读取环境变量的代理配置,需要手动给请求对象设置Proxy属性:
var wq = HttpWebRequest.Create(uri); // 手动设置代理 wq.Proxy = new WebProxy("你的代理地址:端口", true) { // 如果代理需要认证的话加下面这行 Credentials = new NetworkCredential("代理用户名", "代理密码") }; // 后面的请求头、请求体逻辑和原来一致
另外你提到的TLS协议配置可以保留TLS1.2的配置,避免协议兼容问题:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
3. 额外验证步骤
如果配置完代理还是报错,可以先在服务器上抓包,确认请求的目标地址是否正确指向了代理服务器,而不是直接尝试连接谷歌的公网IP。另外确认代理服务器的规则是否允许443端口的HTTPS、gRPC流量通过,没有额外的域名或者请求头拦截规则。
内容的提问来源于stack exchange,提问作者NoopikxD
相关产品推荐
相关产品推荐

