gRPC之.Net6中的客户端和服务端共用proto协议文件
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
属性值为Both
(Both
表示我们刚才选择的Client and Service
,Client
表示客户端,Service
表示服务端),如下图所示:
注意:如果项目的编辑文件中,没有Protobuf
节点设置,请手动增加进去,不然到时候在生成的时候不会生成协议文件
对应的类文件
2.5、生成项目
此时我们重新生成下Quber.Grpc.Common
类库项目,会发现在obj\Debug\net6.0\Protos
目录下生成了user.proto协议文件
对应的2个类文件,如下图所示:
2.6、改造服务端和客户端项目
改造
Quber.Grpc.Service
项目在
Quber.Grpc.Service
项目中,我们添加对Quber.Grpc.Common
类库项目的引用,如下图所示:然后我们将
Quber.Grpc.Service
项目中的整个Protos
文件夹删除掉,如下图所示:修改
UserService.cs
服务文件中的命名空间,如下图所示:此时我们注意到
User.UserBase
、UserInfoResult
和UserInfoRequest
都来自我们新建的Quber.Grpc.Common
类库项目。运行
Quber.Grpc.Service
项目,如下图所示:如上图所示,
Quber.Grpc.Service
服务端就运行成功了。改造
Quber.Grpc.Client
项目在
Quber.Grpc.Client
项目中,我们添加对Quber.Grpc.Common
类库项目的引用,如下图所示:然后我们将
Quber.Grpc.Client
项目中的整个Protos
文件夹删除掉,如下图所示:修改服务文件
UserTest.cs
和UserTestIoc.cs
以及启动文件Program.cs
中的命名空间,如下图所示:此时我们注意到
User.UserClient
和UserInfoRequest
都来自我们新建的Quber.Grpc.Common
类库项目。运行
Quber.Grpc.Client
项目,如下图所示:如上图所示,
Quber.Grpc.Client
客户端就运行成功了。
同理,我们可以将Quber.Grpc.Web
项目也按照上述说明进行调整,此处就不一一演示了。
通过上述步骤的演示,我们就达到了客户端和服务端公用一份proto协议文件
的目的,就不用在每个项目中新建相同的proto协议文件
了,后期只需要维护一份proto协议文件
即可。
gRPC之.Net6中的客户端和服务端共用proto协议文件的更多相关文章
- Socket实例之客户端向服务端数据库上传文件UI版
http://blog.csdn.net/su20145104009/article/details/52843735 首先实现分析: 1用户注册 客户单选择‘用户注册’,提示要输入用户名,密码,确认 ...
- Netty4 学习笔记之二:客户端与服务端心跳 demo
前言 在上一篇Netty demo 中,了解了Netty中的客户端和服务端之间的通信.这篇则介绍Netty中的心跳. 之前在Mina 中心跳的使用是通过继承 KeepAliveMessageFacto ...
- javaWeb项目中的路径格式 请求url地址 客户端路径 服务端路径 url-pattern 路径 获取资源路径 地址 url
javaweb项目中有很多场景的路径客户端的POST/GET请求,服务器的请求转发,资源获取需要设置路径等这些路径表达的含义都有不同,所以想要更好的书写规范有用的路径代码 需要对路径有一个清晰地认知 ...
- node.js中ws模块创建服务端和客户端,网页WebSocket客户端
首先下载websocket模块,命令行输入 npm install ws 1.node.js中ws模块创建服务端 // 加载node上websocket模块 ws; var ws = require( ...
- 在HTTP通讯过程中,是客户端还是服务端主动断开连接?
比如说:IE访问IIS,获取文件,肯定是要建立一个连接,这个连接在完成通讯后,是客户端Close了连接,还是服务端Close了连接.我用程序测模拟IE和IIS,都没有收到断开连接的消息,也就是都没有触 ...
- gRPC (1):入门及服务端创建和调用原理
1. RPC 入门 1.1 RPC 框架原理 RPC 框架的目标就是让远程服务调用更加简单.透明,RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP).序列化方式(XML/Json/ 二进制)和 ...
- TCP学习之三:客户端、服务端同步传输字符串
参考学习张子阳大神的博客:http://www.cnblogs.com/JimmyZhang/category/101698.html 一个客户端.发送一条消息 客户端: 服务端: 注意:Networ ...
- 客户端向服务端传送特殊字符解决方法(检测到有潜在危险的 Request.Form 值)
当客户端向服务端传输特殊字符时报错,错误信息如下图:
- webservice 服务端例子+客户端例子+CXF整合spring服务端测试+生成wsdl文件 +cxf客户端代码自动生成
首先到CXF官网及spring官网下载相关jar架包,这个不多说.webservice是干嘛用的也不多说. 入门例子 模拟新增一个用户,并返回新增结果,成功还是失败. 大概的目录如上,很简单. Res ...
- SignalR 实现web浏览器客户端与服务端的推送功能
SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话. 换句话说,该对话可不受限制地进行单个无状态请求/响应数据交换:它将继 ...
随机推荐
- holiday08
第八天 管道 linux允许将 一个命令的输出 可以 通过管道 作为 另一个命令的输入 ls -lh | more 可以理解现实生活中的管子,管子一头塞东西进去,另一头取出来,这里 | 的左右分为两端 ...
- Coursera Programming Languages, Part B 华盛顿大学 Week 2
Datatype-programming in Racket without structs 在 ML 语言中,我们使用 datatype binding 来实现对 标签联合类型的构建:传送门 这是因 ...
- 逆向学习物联网-网关ESP8266-05课程小结
1. 移花接木 本章利用自己设计的网关代替体验系统中的网关,开启了分模块设计系统的设计模式. 2.透明传输 终端传输来的数据,以MQTT协议透明传输到云及其他订阅者,简化终端系统的设计. 3. 利用状 ...
- 「SOL」射命丸文的笔记 (洛谷)
讲题人:"这是一个很经典的模型,大家应该都会" 我:"???" # 题面 给出 \(m\),求所有 \(m\) 个点的有标号强联通竞赛图的哈密顿回路数量的平均数 ...
- 关于js闭包的基础理解
闭包 拿一个可以记录函数调用次数的来进行理解,如下方 let n = 0 function numUp(){ n++ console.log(n) } const fn = numUp() fn() ...
- DAST精简代码
先训练G:先不计算D的梯度: 判别器输入类型为(源域,0)或者(目标域,1),输出图片为真实图片(源域)的概率值for param in model_D.parameters(): # model_D ...
- axios取消重复请求与更新token并续订上次请求
一.问题引入 当用户发起一个请求时,判断token是否已过期,若已过期则先调refreshToken接口,拿到新的token后再继续执行之前的请求. 难点:当同时发起多个请求,token 过期会调用多 ...
- Jetpack Compose 加载 Drawable
Drawable Painter A library which provides a way to use Android drawables as Jetpack Compose Painters ...
- HidController控件下载安装
用Delphi 或 C++ 开发 USB 接口时要用到的 HidController控件,如果你找不到去哪下载参考这里. 下载地址:https://sourceforge.net/projects/j ...
- JS Math与一些原始类型
镇楼图 Pixiv:DSマイル 一.值属性.函数 globalThis JS有全局对象,但是在不同环境中全局对象均不同.在Web环境中,window.self.frames取得全局对象,在Web Wo ...