Grpc Client專案要如何設定,請參考之前的文章
這裡主要說明的是如何使用C# .NetCore作為Client連結Golang的Grpc Server。
Golang Grpc Server proto調整
syntax = "proto3"; // 定義要使用的 protocol buffer 版本 option csharp_namespace = "GrpcTestApi"; package grpcServer; // for name space //option go_package = "./;grpcServer"; // generated code 的 full Go import path message SumRequest { repeated int64 input = 1 [packed=true]; } message SumResponse { int64 result = 1; } message RemainderRequest{ int64 a = 1; int64 b = 2; } message RemainderResponse { int64 result = 1; } service grpcService { rpc Sum(SumRequest) returns (SumResponse) {}; rpc Remainder(RemainderRequest) returns (RemainderResponse) {}; }
連線Grpc Client Help物件
public class GrpcServerConnectHelp { private string serverUrl; private grpcService.grpcServiceClient client; public string ServerUrl { get { return serverUrl; } } public GrpcServerConnectHelp() { Init(System.Configuration.ConfigurationManager.AppSettings.Get("GrpcServerUrl")); } public void Init(string url = null) { if (string.IsNullOrEmpty(url)) return; serverUrl = url; //.NetCore 3.*版本必須加入此行,否則會錯誤。 AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); var channel = GrpcChannel.ForAddress(serverUrl); client = new grpcService.grpcServiceClient(channel); } public string CommonApi(string method, string input) { string resp = "查無此函式"; if (method.Equals("Sum")) { return Sum(input); } if(method.Equals("Remainder")) { return Remainder(input); } return resp; } private string Sum(string input) { dynamic dyn = JsonConvert.DeserializeObject(input); SumRequest request = new SumRequest(); foreach(var value in dyn.Input) { long temp = Convert.ToInt64(value); request.Input.Add(temp); } var reply = client.Sum(request); return reply.Result.ToString(); } private string Remainder(string input) { dynamic dyn = JsonConvert.DeserializeObject(input); RemainderRequest request = new RemainderRequest(); request.A = dyn.A; request.B = dyn.B; var reply = client.Remainder(request); return reply.Result.ToString(); } }
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
重點在於.Net Core 3.*的版本再傳入URL前,必須加入上面的語法,否則會產生錯誤。