Abp + Grpc 如何实现用户会话状态传递
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 内部的值,当 。定义如下:
1 IDisposable Use(int? tenantId, long? userId); 使用方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class TestAppService : ITransientDependency { private readonly IAbpSession _abpSession; public TestAppService(IAbpSession abpSession) { _abpSession = abpSession; } public void TestMethod() { using(_abpSession.