这是我的第一个gRPC应用。我试图从。net 5 gRPC客户端(Grpc.Net)调用服务器流RPC调用。Client 2.35.0),导致我的本地开发环境出现以下异常:
Grpc.Core。RpcException: Status(StatusCode="Internal", Detail="Error启动gRPC呼叫。HttpRequestException:请求HTTP 2.0版本当HTTP/2不是时,使用版本策略RequestVersionOrHigher启用!">
无论服务器应用程序是否正在运行,都会发生此操作。下面是我用来调用的代码:
using var channel = GrpcChannel.ForAddress(@"http://localhost:5000");
var client = new AlgorithmRunner.AlgorithmRunnerClient(channel);
using var call = client.RunAlgorithm(new RunAlgorithmRequest());
while (await call.ResponseStream.MoveNext())
{
}
我的理解是。net 5 gRPC应该默认启用HTTP/2:为什么异常表明HTTP/2未启用,我如何解决它?
经过进一步调查,这似乎与我的机器上与我公司网络设置相关的代理设置有关。具体来说,我定义了以下环境变量:
http_proxy https_proxy
。. NET从这些环境变量填充HttpClient DefaultProxy。我的公司代理似乎干扰了HTTP/2(不支持?),阻止gRPC正常工作。本地开发的解决方案是在进行gRPC调用之前手动设置HttpClient的默认代理:
HttpClient.DefaultProxy = new WebProxy();
using var channel = GrpcChannel.ForAddress(@"http://localhost:5000");
var client = new AlgorithmRunner.AlgorithmRunnerClient(channel);
using var call = client.RunAlgorithm(new RunAlgorithmRequest());
这可能代表了通过某些类型的代理使用gRPC的一般问题。
我也遇到过同样的问题,坐在公司代理后面,收到这个错误消息
An exception of type 'Grpc.Core.RpcException' occurred in System.Private.CoreLib.dll but was not handled in user code: 'Status(StatusCode="Unavailable", Detail="Error starting gRPC call. HttpRequestException: Connection refused SocketException: Connection refused", DebugException="System.Net.Http.HttpRequestException: Connection refused
我完全同意你建议的通过覆盖DefaultProxy绕过所有代理设置的解决方案是合法和有效的。
一个稍微好一点的方法是不要在代码中硬编码"绕过所有代理语句",而是使用no_proxy环境变量。此环境变量的目的是定义一个规则,用于排除发送到某些主机的流量 <<p>解决方案/strong>激活env。变量no_proxy用于您的开发设置,如
linux
export no_proxy=localhost,127.0.0.1
为Dockerfile
ENV no_proxy=localhost,127.0.0.1
关于代理环境变量的深入会话
当您启动gRPC客户端应用程序时,检查读取环境变量的值是很重要的,因为gRPC在底层使用HttpClient类,它考虑所有代理环境变量。如果未设置no_proxy值,则无效。var noProxy = Environment.GetEnvironmentVariable("no_proxy");
如果您发现此页面是因为您的错误发生在Fiddler运行时,我找到了我需要的答案(检查WCF流量)下面。我只需要配置Fiddler,不需要修改代码或环境。
https://stackoverflow.com/a/73398308/5269981