. net 5 GRPC客户端调用抛出异常:请求HTTP 2.0版本与版本策略RequestVersionOrHighe



这是我的第一个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

最新更新