Protocol buffers 将基于Java的Grpc服务器与基于C的客户端一起使用时出现传输失败错误

Protocol buffers 将基于Java的Grpc服务器与基于C的客户端一起使用时出现传输失败错误,protocol-buffers,grpc,grpc-java,proto,grpc-dotnet,Protocol Buffers,Grpc,Grpc Java,Proto,Grpc Dotnet,我正在使用spring boot(2.2.2)和Grpc server spring boot starter java库开发一个基于java的Grpc服务器。 我的客户端应用程序是一个C#应用程序(netcoreapp3.1)。这两个应用程序都在我的笔记本电脑上运行 这是我的原始文件 syntax = "proto3"; option java_multiple_files = true; option java_package = "com.honeywell.EOM.SystemAPI.

我正在使用spring boot(2.2.2)和Grpc server spring boot starter java库开发一个基于java的Grpc服务器。 我的客户端应用程序是一个C#应用程序(netcoreapp3.1)。这两个应用程序都在我的笔记本电脑上运行

这是我的原始文件

syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.honeywell.EOM.SystemAPI.webapi.web.grpc.service";
//option java_outer_classname = "TestProto";

service Simple {
    rpc GetData (Empty) returns (Data) {
    }
}

message Empty {

}

message Data {
    string name = 1;
}
这是服务代码

@GrpcService
public class TestService extends SimpleGrpc.SimpleImplBase {
    @Override
    public void getData(Empty request, StreamObserver<Data> responseObserver) {
        Data data = Data.newBuilder().setName("Somename").build();
        responseObserver.onNext(data);
        responseObserver.onCompleted();
    }
}
C#客户端代码在这里

using var channel = GrpcChannel.ForAddress("https://localhost:9090");
var client = new Simple.SimpleClient(channel);
var reply = client.GetData(new Empty { });

我做错了什么?这是开放性缺陷吗?

错误消息报告接收到的字节(十六进制):

16030100b6010000b203035e95b0402c6320969d3d5fba04

三个起始字节
160301
看起来像TLS握手。服务器可能处于纯文本模式,而客户端正在使用TLS

要在客户端上使用纯文本,请使用“http”:

使用var channel=GrpcChannel.ForAddress(“http://localhost:9090");


编辑:此答案的代码示例已损坏;它不能正确地启用纯文本

,正如Eric Anderson的回答中所述,客户端确实在使用TLS

gRPC的.NET Core客户端在与不安全(非TLS)服务器通信时需要额外配置(从.NET Core 3.1开始)

//必须在创建GrpcChannel/HttpClient之前设置此开关。
AppContext.SetSwitch(
“System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport”,true);
使用var channel=GrpcChannel.ForAddress(“http://localhost:9090");
var client=new Simple.SimpleClient(通道);
var reply=client.GetData(新的空{});

这是什么TFM?这看起来应该工作得很好;您是否有代理或http检查器(fiddler等)在这里?如果是这样的话:他们可能会因为没有正确地继续使用http/2netcoreapp3.1而中断传输。我已将此添加到问题和任何网络检查器工具(如fiddler或类似工具)中。建议:为了缩小问题范围,可以使用Google传输(而不是Microsoft传输),方法是从nuget添加对
Grpc.Core
的包引用,以及
Channel=new Channel(“localhost:9090”),不安全)(客户端的其余代码相同);如果问题是相同的,那么问题是网络或服务器;如果问题消失了,那么您应该在这里记录它(尽可能多的上下文,最好是一个repo),从而与JamesNK取得联系:这起作用了!您可以将此添加为答案,以便我可以将问题标记为已回答。这会在Spring引导控制台信息中出现以下错误:传输失败io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2Exception:意外的HTTP/1.x请求:POST/Simple/GetDataThank。这很有效。但是,对于输入错误,https应更改为HttpPologies。固定的
using var channel = GrpcChannel.ForAddress("https://localhost:9090");
var client = new Simple.SimpleClient(channel);
var reply = client.GetData(new Empty { });