【C# .Net Framework】在.Net Framework中使用gRPC

protorock發表於2020-10-03

隨著.Net Core 3.0及後續版本的出現,微軟似乎正在放棄極具Windows特徵的WCF。作為WCF的替代者,VS Code 或VS2019已經有基於.Net Core 3.0平臺的“gPRC專案模板”。這個模板極大地簡化了gRPC的開發過程。

gRPC也可應用於.Net Framework。由於VS2019沒有提供基於.Net Framework平臺的“gPRC專案模板”,開發者需要用手工方式處理。本文采用VS2019,以.Net Framework 4.7.2為例,描述gPRC的實現步驟。

步驟一、 建立解決方案及專案

  1.  Greeter,.Net Framework4.7.2類庫專案,定義伺服器與客戶端之間服務協議
  2.  GreeterServer,.Net Framework4.7.2控制檯程式,gRPC服務端,提供gPRC服務
  3.  GreeterClinet,.Net Framework4.7.2控制檯程式,gRPC客戶端,呼叫GreetServer提供的服務

步驟二、NuGet獲取程式包

1. 在“解決方案gRPCDemo”滑鼠右鍵,“管理解決方案的NuGet程式包”

2. 安裝“Google.ProtoBuf”

3. 安裝“Grpc.Core”

4.安裝“Grpc.Tools”

步驟三、編寫服務協議並生成服務類(此步驟需手工處理)

1. 在類庫專案“Greeter”中新增“helloworld.proto”檔案,輸入以下服務定義。

syntax = "proto3";

package Greeter;

service Greet {
	rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
	string name = 1;
}

message HelloReply {
	string message = 1;
}

2. 生成服務類

在“解決方案”上點選滑鼠右鍵,“在檔案資源管理器中開啟資料夾”

輸入以下命令,將“hello.proto”轉換為服務類

packages\Grpc.Tools.2.32.0\tools\windows_x86\protoc.exe -I Greeter --csharp_out Greeter Greeter\hello.proto --grpc_out Greeter --plugin=protoc-gen-grpc=packages\Grpc.Tools.2.32.0\tools\windows_x86\grpc_csharp_plugin.exe

3. 將生成的服務類Hello.cs和HelloGrpc.cs新增到“Greeter”專案中

4. 編譯類庫“Greeter”

步驟四、編寫服務端

1. 新增類庫專案Greeter引用

2. 服務端程式碼

using Greeter;
using Grpc.Core;
using System;
using System.Threading.Tasks;

namespace GreeterServer
{
    class Program
    {
        static void Main(string[] args)
        {
            const int port = 5555;
            Server server = new Server
            {
                Services = { Greet.BindService(new GreetImpl()) },
                Ports = { new ServerPort("localhost", port, ServerCredentials.Insecure) }
            };
            server.Start();

            Console.WriteLine($"Greeter Server Listening on port {port}");
            Console.WriteLine("Press Enter to exit");
            Console.ReadLine();

            server.ShutdownAsync().Wait();

        }
    }

    class GreetImpl: Greet.GreetBase
    {
        public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
        {
            return Task.FromResult(new HelloReply { Message = $"Hello {request.Name}" });
        }
    }
    
}

步驟五、編寫客戶端程式碼

1. 新增類庫專案Greeter引用

2. 客戶端程式碼

using Greeter;
using Grpc.Core;
using System;

namespace GreeterClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Channel channel = new Channel("127.0.0.1:5555", ChannelCredentials.Insecure);
            var client = new Greet.GreetClient(channel);
            var replay = client.SayHello(new HelloRequest { Name = "Auto" });
            Console.WriteLine($"{replay.Message}");

            channel.ShutdownAsync().Wait();
            Console.ReadLine();
        }
    }
}

執行結果

相關文章