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前,必須加入上面的語法,否則會產生錯誤。
 
 
