随着.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的实现步骤。
步骤一、 创建解决方案及项目
- Greeter,.Net Framework4.7.2类库项目,定义服务器与客户端之间服务协议
- GreeterServer,.Net Framework4.7.2控制台程序,gRPC服务端,提供gPRC服务
- 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();
}
}
}
运行结果