浅析C#封装GRPC类库及调用简单实例

 更新时间:2024年04月11日 08:42:32   作者:wtc87  
这篇文章主要为大家详细介绍了C#中封装GRPC类库及调用简单实例的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

一个简单的C#实例。包括:GRPC文件的创建生成、服务端和客户端函数类库的封装、创建服务端和客户端调用测试。若有错误或更好的方法还请指正。

1、创建并生成GRPC服务文件

(1)打开vs2022,创建新项目控制台应用(其他应用好像不行)。

(2)需要安装三个nuget包,如图:

(3)项目添加新建项,选择类,修改名称为Link.proto,添加后把内容全部删除。

(4)添加如下代码。测试实例为服务端和客户端传输字符串消息,所以博主只定义了一个方法(客户端调用,服务端重写),传输内容包括请求字符串和回复字符串。此处可自行定义。

proto

syntax = "proto3";

option csharp_namespace = "LinkService";

service Link
{
	rpc GetMessage(Mes) returns (Mes);
}

message Mes
{
	string StrRequest = 1;
	string StrReply = 2;
}

(5)右键Link.proto文件选择属性,生成操作选择如图:

(6)生成解决方案。在下图路径得到自动生成的两个类。

至此,获得GRPC服务需要的三个文件:Link.proto、Link.cs、LinkGrpc.cs。可以将这三个文件放在一个项目中直接使用,需要重写一下服务端方法、创建服务端和客户端的启动方法。但是如果不同的项目软件之间通讯需要各自如此开发。可以先封装成一个GRPC类库供其他项目直接调用。

2、服务端和客户端函数类库的封装

(1)vs2022创建类库(.NET Framework)项目。

项目添加现有项,上面获得的三个文件。安装nuget包:Grpc.Core和Google.Protobuf。

(2)此处创建两个类:LinkFunc用于放此类库可用于外部引用调用的方法。LinkServerFunc基于Link.LinkBase,用于重写在proto文件中定义的方法。

对于不同的项目,在客户端请求时,服务端要根据自身情况回复想回的内容,因此可以提供一个委托供外部自行开发回复函数。

在LinkFunc类中定义如下:

public static Func<string, string> ReplyMes;

1)在LinkServerFunc类重写GetMessage方法如下:

LinkServerFunc

 using Grpc.Core;
using LinkService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static LinkService.Link;

namespace GrpcLink
{
    public class LinkServerFunc : LinkBase
    {
        public override Task<Mes> GetMessage(Mes request, ServerCallContext context)
        {
            Mes mes = new Mes();
            mes.StrReply = LinkFunc.ReplyMes(request.StrRequest);
            return Task.FromResult(mes);
        }
    }
}

2)开始写LinkFunc类。

LinkFunc

 using Grpc.Core;
using LinkService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks;
using static LinkService.Link;

namespace GrpcLink
{
    public class LinkFunc
    {
        // 用于服务端回复委托
        public static Func<string, string> ReplyMes;

        // 定义服务端和客户端
        public static Server LinkServer;
        public static LinkClient LinkClient;

        // 服务端启动
        public static void LinkServerStart(string host, int port)
        {
            LinkServer = new Server
            {
                Services =
                    {
                        BindService(new LinkServerFunc())
                    },
                Ports = { new ServerPort(host, port, ServerCredentials.Insecure) }
            };
            LinkServer.Start();
        }

        // 服务端关闭
        public static void LinkServerClose()
        {
            LinkServer?.ShutdownAsync().Wait();
        }

        // 客户端启动
        public static void LinkClientStart(string strIp)
        {
            Channel prechannel = new Channel(strIp, ChannelCredentials.Insecure);
            LinkClient = new LinkClient(prechannel);
        }

        // 客户端发送消息函数
        public static string SendMes(string strRequest)
        {
            Mes mes = new Mes();
            mes.StrRequest = strRequest;
            var res = LinkClient.GetMessage(mes);
            return res.StrReply;
        }
    }
}

(3)生成解决方案。Debug中可以得到项目的dll文件GrpcLink.dll,其他项目可以引用使用了。

 3、创建服务端和客户端调用测试

(1)vs2022创建两个Windows窗体应用(.NET Framework)项目。将上述GrpcLink.dll文件分别放入两个项目中,并添加dll引用。安装nuget包:Grpc.Core和Google.Protobuf。

(2)服务端TestServer项目。

 窗体:

窗体代码:

TestServer

 using GrpcLink;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TestServer
{
    public partial class FormServer : Form
    {
        public FormServer()
        {
            InitializeComponent();
            LinkFunc.LinkServerStart("127.0.0.1", 9008);
            LinkFunc.ReplyMes = ReplyMes;
        }

        public string ReplyMes(string strRequest)
        {
            Invoke(new Action(() => { tbReply.Text = strRequest; }));
            
            string reply = tbRequest.Text;
            return reply;
        }
    }
}

 (3)客户端TestCilent项目。

 窗体:

窗体代码:

TestCilent

 using GrpcLink;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TestCilent
{
    public partial class FormCilent : Form
    {
        public FormCilent()
        {
            InitializeComponent();
            LinkFunc.LinkClientStart("127.0.0.1:9008");
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            string strmes = tbRequest.Text;
            string strres = LinkFunc.SendMes(strmes);
            tbReply.Text = strres;
        }
    }
}

 (4)运行两个项目进行测试。

在客户端的发送区输入要发送的内容。

在服务端的回复区输入要回复的内容。

点击发送:

到此这篇关于浅析C#封装GRPC类库及调用简单实例的文章就介绍到这了,更多相关C#封装GRPC类库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • XAML如何获取元素的位置

    XAML如何获取元素的位置

    这篇文章主要为大家详细介绍了XAML如何获取元素的位置,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • C#泛型概念的简介与泛型的使用

    C#泛型概念的简介与泛型的使用

    今天小编就为大家分享一篇关于C#泛型概念的简介与泛型的使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • C#使用BackgroundWorker控件

    C#使用BackgroundWorker控件

    这篇文章介绍了C#使用BackgroundWorker控件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • C# Helper开发一个简单的端口监控工具

    C# Helper开发一个简单的端口监控工具

    C# 端口监控 Helper 是一款基于C#语言的工具,这个意义在于帮助开发者快速实现对指定端口的监控,以保障(观察)网络服务的正常运行,下面我们就来看看具体实现方法吧
    2025-09-09
  • unity 如何获取Text组件里text内容的长度

    unity 如何获取Text组件里text内容的长度

    这篇文章主要介绍了unity 获取Text组件里text内容的长度操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • C# DLL跨语言调用的两种实现方法

    C# DLL跨语言调用的两种实现方法

    这篇文章主要介绍了如何编写能被其他编程语言调用的C# DLL,包括两种主流方式:通过COM接口或P/Invoke封装非托管导出函数,重点在于让C# DLL符合跨语言调用的标准,包括数据类型兼容性、框架选择和错误处理等关键要点,需要的朋友可以参考下
    2026-03-03
  • C#实现窗体中动态按钮的设计方法

    C#实现窗体中动态按钮的设计方法

    在窗体界面中,通常以按钮来代替菜单栏的功能,这种形式虽然给用户一种直观、界面风格各异的感觉,但通常按钮都是以静止的形式显示,所以本文给大家介绍了C#实现窗体中动态按钮的设计方法,感兴趣的朋友可以参考下
    2024-04-04
  • C#中的HttpWebRequest类介绍

    C#中的HttpWebRequest类介绍

    本文详细讲解了C#中的HttpWebRequest类,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • C#控制台带参数程序源码编写实例讲解

    C#控制台带参数程序源码编写实例讲解

    像ipconfig /all 这样的CMD命令想必大家都知道,但是很多童鞋可能不知道怎么写这样的控制台带参数的程序,需要的朋友可以了解下
    2012-12-12
  • 在C# WebAPI中实现多版本控制的方法

    在C# WebAPI中实现多版本控制的方法

    随着应用程序的不断演化和功能的不断扩展,API 版本控制成为了开发和维护 WebAPI 时不可或缺的一部分,在本文中,我们将介绍如何在现代 C# WebAPI 项目中有效地实施 API 版本控制,并分享一些最佳实践,需要的朋友可以参考下
    2025-11-11

最新评论