在wpf项目中实现基于Grpc.AspNetCore.Server库的grpc server功能
前言
1.
Grpc.Core库的维护到2024.10,之后应该是不再维护了,后续推荐使用Grpc.Net.Client和Grpc.AspNetCore.Server这两个库代替。
相关声明信息可以在此处看到,https://grpc.io/blog/grpc-csharp-future/
2.
当前工作的项目需求是在同一个局域网的多个wpf,通过grpc进行通讯,一个wpf作为grpc server,将数据发送给不同的wpf grpc client.
3.
新的Grpc.Net.Client与旧的Grpc.Core在Client建立方面,代码区别不大,可以直接参考msdn的文档
https://learn.microsoft.com/zh-cn/aspnet/core/grpc/basics?view=aspnetcore-8.0
// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
4.
核心问题是,Grpc.AspNetCore.Server这个库,官方的Demo里都是基于AspNetCore这个框架实现的,没有实现宿主为wpf或者命令行项目的。
基于此,在测试了一些代码后,实现了在wpf作为宿主,实现了grpc server的功能。
主要参考了以下两篇文章
https://www.cnblogs.com/linxmouse/p/14032352.html
https://laurentkempe.com/2019/09/03/WPF-and-dotnet-Generic-Host-with-dotnet-Core-3-0/
内容
下面说明搭建框架流程,源码会附在文末。
1.
新建一个ASP.NET Core gRPC Service项目
(非必须的步骤,主要是为了获取appsetting.json这个文件,你自己新建一个json也没问题)
2.
新建类库项目GrpcProtoClassLibrary,用于存放****.proto协议和Grpc.Tools编译的文件。
需要安装的Nuget包如图,核心库是Grpc.Tools,帮助我们自动编译生成Client和Server类,其中Grpc.Core.Api和Google.Protobuf是编译时以来的类库。
对于Test.proto文件的属性配置,因为proto文件位于单独的类库项目,Client项目和Server项目都会引用这个类库项目,所以gRPC Stub Classes属性中选择Client and Server。
3. 新建wpf项目,作为grpc client。
添加引用GrpcProtoClassLibrary项目(proto所在的类库),Nuget中添加了Grpc.Net.Client库,还有CommunityToolkit.Mvvm作为mvvm框架。
4.新建wpf项目,作为grpc server。
此处简单说一下,
1.添加GrpcProtoClassLibrary项目引用
2.添加Nuget包,Grpc.AspNetCore.Server
3.TestBiz是用来重写GrpcServer的业务逻辑
4.appsettings.json用来配置AspNetCore项目的配置信息(在此主要用来配置ip和端口)
5.App.xaml.cs在项目启动时,实现GrpcServer的初始化。
6.GrpcServer是个xml结构的配置文件,用于管理项目引用的框架和包含的文件等信息。
7.在编辑完GrpcServer的配置文件后,可以看到项目的Frameworks中添加了Microsoft.AspNetCore.App框架。
核心是App.xaml.cs中的GrpcServer的初始化代码。
以及在GrpcServer中的xml配置信息
结尾
具体代码,可以在项目源码中找到相关参考,本文仅是抛砖引玉。
https://github.com/maoleigepu/GrpcServiceDemo
https://gitee.com/maoleigepu/GrpcServiceDemo
此外,强烈推荐Gihub上的gprc官方样例代码。
https://github.com/grpc/grpc-dotnet/tree/master/examples
里面的ReadMe也非常清晰的描述了,每个样例代码所实现的功能。