Abp + Grpc 如何实现用户会话状态传递
0.背景
在實(shí)際項(xiàng)目當(dāng)中,我采用的是 Abp 框架,但是 Abp 框架官方并沒有針對 Grpc 進(jìn)行模塊封裝。基于此我結(jié)合 Abp 與 MagicOnion 封裝了一個(gè) Abp.Grpc 模塊,它包括服務(wù)端和調(diào)用端兩部分的包。通過這兩個(gè)包,你可以很方便地在 Abp 框架當(dāng)中集成 Grpc 實(shí)現(xiàn)服務(wù)內(nèi)部通訊。
但是在實(shí)際使用當(dāng)中會(huì)出現(xiàn)一個(gè)問題,當(dāng) A 服務(wù)調(diào)用 B 服務(wù)的時(shí)候,A 服務(wù)當(dāng)前登錄用戶為 admin,調(diào)用 B 服務(wù)的?IAbpSession?的值仍然為空,這個(gè)時(shí)候當(dāng) B 服務(wù)內(nèi)部實(shí)現(xiàn)使用了?IAbpSession?時(shí)會(huì)出現(xiàn)問題。
這是因?yàn)橥ㄟ^ Grpc 接口調(diào)用時(shí),并沒有傳遞諸如 Token 之類的東西,而在 B 服務(wù)內(nèi)部的?IAbpSession?本身附加的數(shù)據(jù)是從?HttpContext?里面獲取的,所以 B 服務(wù)當(dāng)前是沒有用戶狀態(tài)的。
1.解決
所幸?IAbpSession?提供了一個(gè)?Use?方法,通過這個(gè)方法我們可以臨時(shí)地改變?IAbpSession?內(nèi)部的值,當(dāng) 。定義如下:
IDisposable Use(int? tenantId, long? userId);使用方法如下:
2.Grpc 接口改造
這里 Abp.Grpc 庫使用的是 MagicOnion 庫實(shí)現(xiàn) Grpc 接口的,底層序列化使用的是 MessagePack,速度也不比 Protocol Buffer 差。
2.1 服務(wù)定義
服務(wù)定義接口時(shí),必須附加一個(gè)?GrpcSession?參數(shù),這個(gè)參數(shù)用于調(diào)用方傳遞其?IAbpSession?值所使用。例如我有一個(gè)接口方法如下,用于返回服務(wù)方接收到的用戶 Id 值。
2.2 服務(wù)提供方
服務(wù)提供方在實(shí)現(xiàn)?ITestGrpcService?的時(shí)候,需要在代碼起始點(diǎn)就開始使用?using?語句包裹代碼。
2.3 服務(wù)調(diào)用方
服務(wù)調(diào)用方則直接在調(diào)用 Grpc 接口的時(shí)候,傳遞給接口當(dāng)前服務(wù)的 Session 狀態(tài)。
2.4 最后的效果
當(dāng)客戶端調(diào)用 GRPC 接口時(shí),會(huì)將自身的 Session 狀態(tài)通過 GrpcSession 傳遞到服務(wù)端,這樣服務(wù)端就能夠共享客戶端的繪畫狀態(tài)。
3.Abp.Grpc 項(xiàng)目地址
Abp.Grpc 庫地址:https://github.com/GameBelial/Abp.Grpc
4.實(shí)現(xiàn)的 DEMO 地址
服務(wù)端: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社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com 
總結(jié)
以上是生活随笔為你收集整理的Abp + Grpc 如何实现用户会话状态传递的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 利用Asp.Net Core的Middl
 - 下一篇: 【翻译】asp.net core中使用M