1、说明

在上一篇文章gRPC之.Net6中的初步使用介绍中,我们简单的介绍了gRPC在服务端、客户端以及Web项目中的使用。

有一个问题,不知道大家发现没有,就是不管在服务端项目还是客户端项目中,我们都需要创建相同的proto协议文件,这样就会显得很麻烦,有没有一种办法只创建一次proto协议文件呢?答案是肯定的:有。

在介绍实现之前,建议大家先查看一下前一篇文章gRPC之.Net6中的初步使用介绍,方便后面关联性的讲解。


2、实现

2.1、新建类库项目

首先我们新建一个名称为Quber.Grpc.Common的类库项目,目的就是用于存放proto协议文件协议文件生成的对应类文件,如下图所示:

2.2、添加引用

接下来我们在Quber.Grpc.Common的类库项目中分别添加如下引用:

Google.Protobuf
Grpc.Core.Api
Grpc.Tools

2.3、创建proto协议文件

我们在Quber.Grpc.Common类库项目中新建一个文件夹Protos,用于存放各种proto协议文件,然后我们把Quber.Grpc.Service项目中的user.proto协议文件复制过来,复制过来后,将user.proto协议文件中的命名空间修改为Quber.Grpc.Common.Protos和该类库保持一致),如下图所示:

2.4、修改协议文件属性

鼠标右键user.proto协议文件,选择属性(或者鼠标选中user.proto协议文件,然后按ALT+Enter快捷键打开文件属性窗体),在打开的属性窗体中,将Build Action选项设置为Protobuf compiler,将gRPC Stub Classes选项设置为Client and Server,然后点击应用确定即可,如下图所示:

此时,我们双击Quber.Grpc.Common类库项目,在编辑文件中,我们会发现有一个Protobuf节点设置,并且该节点中的GrpcServices属性值为BothBoth表示我们刚才选择的Client and ServiceClient表示客户端,Service表示服务端),如下图所示:

注意:如果项目的编辑文件中,没有Protobuf节点设置,请手动增加进去,不然到时候在生成的时候不会生成协议文件对应的类文件

2.5、生成项目

此时我们重新生成下Quber.Grpc.Common类库项目,会发现在obj\Debug\net6.0\Protos目录下生成了user.proto协议文件对应的2个类文件,如下图所示:

2.6、改造服务端和客户端项目

  1. 改造Quber.Grpc.Service项目

    Quber.Grpc.Service项目中,我们添加对Quber.Grpc.Common类库项目的引用,如下图所示:

    然后我们将Quber.Grpc.Service项目中的整个Protos文件夹删除掉,如下图所示:

    修改UserService.cs服务文件中的命名空间,如下图所示:

    此时我们注意到User.UserBaseUserInfoResultUserInfoRequest都来自我们新建的Quber.Grpc.Common类库项目。

    运行Quber.Grpc.Service项目,如下图所示:

    如上图所示,Quber.Grpc.Service服务端就运行成功了。

  2. 改造Quber.Grpc.Client项目

    Quber.Grpc.Client项目中,我们添加对Quber.Grpc.Common类库项目的引用,如下图所示:

    然后我们将Quber.Grpc.Client项目中的整个Protos文件夹删除掉,如下图所示:

    修改服务文件UserTest.csUserTestIoc.cs以及启动文件Program.cs中的命名空间,如下图所示:

    此时我们注意到User.UserClientUserInfoRequest都来自我们新建的Quber.Grpc.Common类库项目。

    运行Quber.Grpc.Client项目,如下图所示:

    如上图所示,Quber.Grpc.Client客户端就运行成功了。


同理,我们可以将Quber.Grpc.Web项目也按照上述说明进行调整,此处就不一一演示了。

通过上述步骤的演示,我们就达到了客户端和服务端公用一份proto协议文件的目的,就不用在每个项目中新建相同的proto协议文件了,后期只需要维护一份proto协议文件即可。

gRPC之.Net6中的客户端和服务端共用proto协议文件的更多相关文章

  1. Socket实例之客户端向服务端数据库上传文件UI版

    http://blog.csdn.net/su20145104009/article/details/52843735 首先实现分析: 1用户注册 客户单选择‘用户注册’,提示要输入用户名,密码,确认 ...

  2. Netty4 学习笔记之二:客户端与服务端心跳 demo

    前言 在上一篇Netty demo 中,了解了Netty中的客户端和服务端之间的通信.这篇则介绍Netty中的心跳. 之前在Mina 中心跳的使用是通过继承 KeepAliveMessageFacto ...

  3. javaWeb项目中的路径格式 请求url地址 客户端路径 服务端路径 url-pattern 路径 获取资源路径 地址 url

    javaweb项目中有很多场景的路径客户端的POST/GET请求,服务器的请求转发,资源获取需要设置路径等这些路径表达的含义都有不同,所以想要更好的书写规范有用的路径代码 需要对路径有一个清晰地认知 ...

  4. node.js中ws模块创建服务端和客户端,网页WebSocket客户端

    首先下载websocket模块,命令行输入 npm install ws 1.node.js中ws模块创建服务端 // 加载node上websocket模块 ws; var ws = require( ...

  5. 在HTTP通讯过程中,是客户端还是服务端主动断开连接?

    比如说:IE访问IIS,获取文件,肯定是要建立一个连接,这个连接在完成通讯后,是客户端Close了连接,还是服务端Close了连接.我用程序测模拟IE和IIS,都没有收到断开连接的消息,也就是都没有触 ...

  6. gRPC (1):入门及服务端创建和调用原理

    1. RPC 入门 1.1 RPC 框架原理 RPC 框架的目标就是让远程服务调用更加简单.透明,RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP).序列化方式(XML/Json/ 二进制)和 ...

  7. TCP学习之三:客户端、服务端同步传输字符串

    参考学习张子阳大神的博客:http://www.cnblogs.com/JimmyZhang/category/101698.html 一个客户端.发送一条消息 客户端: 服务端: 注意:Networ ...

  8. 客户端向服务端传送特殊字符解决方法(检测到有潜在危险的 Request.Form 值)

    当客户端向服务端传输特殊字符时报错,错误信息如下图:

  9. webservice 服务端例子+客户端例子+CXF整合spring服务端测试+生成wsdl文件 +cxf客户端代码自动生成

    首先到CXF官网及spring官网下载相关jar架包,这个不多说.webservice是干嘛用的也不多说. 入门例子 模拟新增一个用户,并返回新增结果,成功还是失败. 大概的目录如上,很简单. Res ...

  10. SignalR 实现web浏览器客户端与服务端的推送功能

    SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话. 换句话说,该对话可不受限制地进行单个无状态请求/响应数据交换:它将继 ...

随机推荐

  1. 2.TS 的数据类型

    一.定义变量 TS 中创建变量有四个要素: 定义变量的关键字:var.let.const 变量名 变量的数据类型 变量的初始值 语法结构如下: let 变量名: 数据类型 = 初始值 注意,变量的初始 ...

  2. mobx hook中的使用

    class import { inject, observer } from "mobx-react"; // 需要使用mobx-react提供的Provider 包裹,需要使用的 ...

  3. js检测邮箱格式,正则检测邮箱格式

    网上搜了关于邮箱格式的检测,发现很多不太适用,我自己写了一个,可以检测有开头和没开头的,又可以检测@,@qq. 后的格式 var myReg=/^(\w|(\.\w+))+@([a-zA-Z0-9_- ...

  4. 【BOOK】数据存储—文件存储(TXT、JSON、CSV)

    数据存储 文本文件-TXT.JSON.CSV 关系型数据库-MySQL.SQLite.Oracle.SQL Server.DB2 非关系型数据库-MongoDB.Redis   文件打开 open() ...

  5. Day09-方法

    方法 一.何谓方法 java方法是语句的集合,他们在一起执行一个功能 方法是解决一类问题的步骤的有序集合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 设计方法的原则: 方法的本意是功能 ...

  6. Eclipse 搭建一个简单的SpringBoot+WebSocket环境

    WebSocket是一种在单个TCP连接上进行全双工通信的协议. WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范. WebSocket API也被 ...

  7. python 时间戳转日期 不自动补零 without zero-padding

    1. 时间戳转日期 代码 import time timestamp = 1568171336 time_format = "%Y-%m-%d %H:%M:%S" time_loc ...

  8. JAVA基础Day1-注释/标识符和关键字/数据类型/类型转换/变量、常量、作用域

    目录 一.注释 二.标识符和关键字 标识符命名需要注意: 三.数据类型 基本数据类型: 拓展: 定义时需要注意: 四.类型转换 字节 五.变量.常量.作用域 变量 变量命名规范 变量作用域 常量 一. ...

  9. 根据id 删除树结构中的数据

    根据id 删除树结构中的数据  filterHandle(data, id) {                         var newData = data.filter(x => x ...

  10. 面向对象ooDay9

    精华笔记: 多态:多种形态 同一个对象被造型为不同的类型时,有不同的功能-------所有对象都是多态的(明天总结详细讲) 对象的多态:水.我.你...... 同一类型的引用在指向不同的对象时,有不同 ...