0.背景

在实际项目当中,我采用的是 Abp 框架,但是 Abp 框架官方并没有针对 Grpc 进行模块封装。基于此我结合 Abp 与 MagicOnion 封装了一个 Abp.Grpc 模块,它包括服务端和调用端两部分的包。通过这两个包,你可以很方便地在 Abp 框架当中集成 Grpc 实现服务内部通讯。

但是在实际使用当中会出现一个问题,当 A 服务调用 B 服务的时候,A 服务当前登录用户为 admin,调用 B 服务的 IAbpSession 的值仍然为空,这个时候当 B 服务内部实现使用了 IAbpSession 时会出现问题。

这是因为通过 Grpc 接口调用时,并没有传递诸如 Token 之类的东西,而在 B 服务内部的 IAbpSession 本身附加的数据是从 HttpContext 里面获取的,所以 B 服务当前是没有用户状态的。

1.解决

所幸 IAbpSession 提供了一个 Use 方法,通过这个方法我们可以临时地改变 IAbpSession 内部的值,当 。定义如下:

IDisposable Use(int? tenantId, long? userId);

使用方法如下:

2.Grpc 接口改造

这里 Abp.Grpc 库使用的是 MagicOnion 库实现 Grpc 接口的,底层序列化使用的是 MessagePack,速度也不比 Protocol Buffer 差。

2.1 服务定义

服务定义接口时,必须附加一个 GrpcSession 参数,这个参数用于调用方传递其 IAbpSession 值所使用。例如我有一个接口方法如下,用于返回服务方接收到的用户 Id 值。

2.2 服务提供方

服务提供方在实现 ITestGrpcService 的时候,需要在代码起始点就开始使用 using 语句包裹代码。

2.3 服务调用方

服务调用方则直接在调用 Grpc 接口的时候,传递给接口当前服务的 Session 状态。

2.4 最后的效果

当客户端调用 GRPC 接口时,会将自身的 Session 状态通过 GrpcSession 传递到服务端,这样服务端就能够共享客户端的绘画状态。

3.Abp.Grpc 项目地址

Abp.Grpc 库地址:https://github.com/GameBelial/Abp.Grpc

4.实现的 DEMO 地址

服务端:https://github.com/GameBelial/Abp.Grpc.Server.Demo

客户端:https://github.com/GameBelial/Abp.Grpc.Client.Demo

原文地址:https://www.cnblogs.com/myzony/p/9454612.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

Abp + Grpc 如何实现用户会话状态传递相关推荐

  1. 前后端分离 获取用户ip_前后端分离应用——用户信息传递

    前言 记录前后端分离的系统应用下应用场景----用户信息传递 需求缘起 照例先看看web系统的一张经典架构图,这张图参考自网络: 在 Dubbo 自定义异常,你是怎么处理的? 中已经对该架构做了简单说 ...

  2. Linux学习-Linux 主机上的用户讯息传递

    查询使用者: w, who, last, lastlog 如果你想要知道目前已登入在系统上面的用户呢?可以透过 w 或 who 来查询喔!如下范例所示: [root@study ~]# w 01:49 ...

  3. Abp vNext 拓展Ids4-Claims用户信息

    首先,实现IProfileService接口,做一个拓展信息的实现类. /// <summary>/// IDS4获取用户信息服务实现/// </summary>public ...

  4. [Abp 源码分析]多租户体系与权限验证

    点击上方蓝字关注我们 0.简介 承接上篇文章我们会在这篇文章详细解说一下 Abp 是如何结合 IPermissionChecker 与 IFeatureChecker 来实现一个完整的多租户系统的权限 ...

  5. .net core grpc consul 实现服务注册 服务发现 负载均衡(二)

    在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net ...

  6. .net core grpc 实现通信(一)

    现在系统都服务化,.net core 实现服务化的方式有很多,我们通过grpc实现客户端.服务端通信. grpc(https://grpc.io/)是google发布的一个开源.高性能.通用RPC(R ...

  7. [Abp 源码分析]权限验证

    点击上方蓝字关注我们 0.简介 Abp 本身集成了一套权限验证体系,通过 ASP.NET Core 的过滤器与 Castle 的拦截器进行拦截请求,并进行权限验证.在 Abp 框架内部,权限分为两块, ...

  8. Linux_PAM_用户之间的信息传递

    PAM 账户信息的验证,可动态加载验证模块,提高验证的灵活性; PAM是一套应用程序接口,提供一连串的验证机制,借由一个与指令程序相同文件名的配置文件进行认证分析. 验证的过程包含三个字段: 1.验证 ...

  9. springcloudalibaba架构(31):SpringCloud实现用户信息在微服务之间传递(Feign和Dubbo)

    文章目录 前言 第一节 微服务间用户信息传递问题 第二节 解决思路 第三节 实践操作(基于Feign) 1. 调用链路说明 2. shop-common改造 3. 开启注解 4. 启动服务器测试 第四 ...

最新文章

  1. 双目立体匹配算法:Patch Match Stereo实用详解教程
  2. Python知识点5——字典
  3. Git使用入门 - 在Git上新建项目
  4. Mybatis的几点小结
  5. H.264句法和语法总结 句法元素的分层结构
  6. python 句子中没有中文_人生感悟经典句子,生活中可以没有诗歌,但不能没有诗意...
  7. GB28181协议——布防和报警订阅
  8. SQL注入(持续更新中)
  9. Maven最全使用指南,都在这里了
  10. 外贸软件出口管理亮点有哪些,出口贸易过程全解析
  11. 引用次数在15000次以上的都是什么神仙论文?
  12. 李佳琦以特殊人才落户上海,“带货一哥”即将成为“新上海人”
  13. Porting:telnet远程登录开发板、制作并烧写cramfs和ext4和ramdisk三种格式根文件系统镜像
  14. Excel自动转曲线图的时PHP,Excel折线图随着数据的插入动态变化,掌握此技能的人不足1﹪!...
  15. C# 操作通过word模板合并N个word文档
  16. php html5定位,HTML HTML5 地理定位 - 闪电教程JSRUN
  17. 老冀看巴展一:诺基亚发布X手机
  18. pdu电源线_pdu电源插座与普通电源插座的区别
  19. SoftCAM安装流程(适用于泰信T1盒子)
  20. JavaScript漂浮广告效果

热门文章

  1. 在MVC项目中使用Ninject
  2. Nodejs Guides(四)
  3. Java并发编程-原子性变量
  4. 长江存储年底提供自研32层堆叠3D NAND闪存样品
  5. 2017-03-10Git版本回退
  6. [Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例二.
  7. 进入51cto之后的发展方向
  8. WebView 访问 url asset sd 网页
  9. .NET6之MiniAPI(十五):跨域CORS(下)
  10. 使用Spectre.Console创建漂亮的控制台应用程序