.net Core Grpc客户端无法调用Greeter服务

时间:2020-08-14 18:50:23

标签: c# asp.net-core grpc

我已经研究了很长时间,浏览了互联网上所有不同的帖子,以查看是否可以找到遇到相同问题的人,但是我似乎是唯一遇到此问题的人。

我有一个运行Grpc基本问候服务的ASP.net Core服务器。 使用程序“ BloomRPG”调用此服务器效果很好,并且响应时间极佳。 但是,当我尝试从自己的书面客户端(非常基本)执行相同操作时,出现以下错误:

在客户端上:

dbug:Grpc.Net.Client.Internal.GrpcCall [1] 开始gRPC调用。方法类型:“一元”,URI:“ https://www.MYSERVER.com:50005/greet.Greeter/SayHello”。 dbug:Grpc.Net.Client.Internal.GrpcCall [18] 正在发送消息。 记录:Grpc.Net.Client.Internal.GrpcCall [21] 将“ TestService1.HelloRequest”序列化为15个字节的消息。 记录:Grpc.Net.Client.Internal.GrpcCall [19] 讯息已发送。 失败:Grpc.Net.Client.Internal.GrpcCall [6] 启动gRPC调用时出错。 System.Net.Http.HttpRequestException:发送请求时发生错误。 ---> System.IO.IOException:响应过早结束。 在System.Net.Http.HttpConnection.FillAsync() 在System.Net.Http.HttpConnection.ReadNextResponseHeaderLineAsync(BooleanfoldedHeadersAllowed) 在System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage请求,CancellationToken cancelToken) ---内部异常堆栈跟踪的结尾--- 在System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage请求,CancellationToken cancelToken) 在System.Net.Http.HttpConnectionPool.SendWithNtConnectionAuthAsync(HttpConnection连接,HttpRequestMessage请求,布尔值doRequestAuth,CancellationToken取消令牌) 在System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage请求,布尔值doRequestAuth,CancellationToken cancelledToken) 在System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage请求,CancellationToken cancelToken) 在System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage请求,CancellationToken cancelledToken) 在System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(任务1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts) at Grpc.Net.Client.Internal.GrpcCall 2.RunCall(HttpRequestMessage请求,Nullable 1 timeout) info: Grpc.Net.Client.Internal.GrpcCall[3] Call failed with gRPC error status. Status code: 'Internal', Message: 'Error starting gRPC call. HttpRequestException: An error occurred while sending the request. IOException: The response ended prematurely.'. dbug: Grpc.Net.Client.Internal.GrpcCall[4] Finished gRPC call. dbug: Grpc.Net.Client.Internal.GrpcCall[8] gRPC call canceled. Unhandled exception. Grpc.Core.RpcException: Status(StatusCode="Internal", Detail="Error starting gRPC call. HttpRequestException: An error occurred while sending the request. IOException: The response ended prematurely.", DebugException="System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.IO.IOException: The response ended prematurely. at System.Net.Http.HttpConnection.FillAsync() at System.Net.Http.HttpConnection.ReadNextResponseHeaderLineAsync(Boolean foldedHeadersAllowed) at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken) --- End of inner exception stack trace --- at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.SendWithNtConnectionAuthAsync(HttpConnection connection, HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken) at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) at System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) at System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task 1 sendTask,HttpRequestMessage请求,CancellationTokenSource cts,布尔值disposeCts)处 在Grpc.Net.Client.Internal.GrpcCall 2.RunCall(HttpRequestMessage request, Nullable 1超时)”) 在C:\ Users \ MYUSERNAME \ source \ repos \ grpc \ TestgrpcClient \ TestgrpcClient \ Program.cs:line 64中的GrpcGreeterClient.Program.Main(String [] args) 在GrpcGreeterClient.Program。(String [] args)

在服务器上:

失败:Microsoft.AspNetCore.Server.Kestrel [0] 未在仅HTTP / 2的终结点上协商TLS上的HTTP / 2。

由于我成功使用BloomRPC调用了服务,所以我想问题出在我的客户端上:

客户代码:

        AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);


        var loggerFactory = LoggerFactory.Create(logging =>
        {
            logging.AddConsole();
            logging.SetMinimumLevel(LogLevel.Trace);
        });


        var httpclient = new HttpClient();
        httpclient.DefaultRequestVersion = new Version(2, 0);

        




        using var channel = GrpcChannel.ForAddress("https://www.MYSERVER.com:50005",
            new GrpcChannelOptions { LoggerFactory = loggerFactory, HttpClient = httpclient});
        

        var client = new Greeter.GreeterClient(channel);
        
        var reply = await client.SayHelloAsync(
                          new HelloRequest { Name = "GreeterClient" });
        Console.WriteLine("Greeting: " + reply.Message);
        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();
        

有人知道我接下来可以尝试什么? 我觉得我已经用尽了所有的选择:(

1 个答案:

答案 0 :(得分:0)

感谢@jdweng,我弄清楚了导致问题的原因。

强制性公司代理服务器正在干预,在httpclienthandler中将UseProxy = false设置为我已解决了该问题,现在我可以无问题地调用我的gRPC服务器了!

相关问题