怎么在ASP.NET中使用 gRPC攔截器?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括西和網(wǎng)站建設(shè)、西和網(wǎng)站制作、西和網(wǎng)頁(yè)制作以及西和網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,西和網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到西和省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!Interceptor 類介紹
Interceptor
類是gRPC服務(wù)攔截器的基類,是一個(gè)抽象類,它定了幾個(gè)虛方法,分別如下:
public virtual TResponse BlockingUnaryCall(); public virtual AsyncUnaryCall AsyncUnaryCall (); public virtual AsyncServerStreamingCall AsyncServerStreamingCall (); public virtual AsyncClientStreamingCall AsyncClientStreamingCall (); public virtual AsyncDuplexStreamingCall AsyncDuplexStreamingCall (); public virtual Task UnaryServerHandler (); public virtual Task ClientStreamingServerHandler (); public virtual Task ServerStreamingServerHandler (); public virtual Task DuplexStreamingServerHandler ();
各個(gè)方法作用如下:
方法名稱 | 作用 |
---|---|
BlockingUnaryCall | 攔截阻塞調(diào)用 |
AsyncUnaryCall | 攔截異步調(diào)用 |
AsyncServerStreamingCall | 攔截異步服務(wù)端流調(diào)用 |
AsyncClientStreamingCall | 攔截異步客戶端流調(diào)用 |
AsyncDuplexStreamingCall | 攔截異步雙向流調(diào)用 |
UnaryServerHandler | 用于攔截和傳入普通調(diào)用服務(wù)器端處理程序 |
ClientStreamingServerHandler | 用于攔截客戶端流調(diào)用的服務(wù)器端處理程序 |
ServerStreamingServerHandler | 用于攔截服務(wù)端流調(diào)用的服務(wù)器端處理程序 |
DuplexStreamingServerHandler | 用于攔截雙向流調(diào)用的服務(wù)器端處理程序 |
在實(shí)際使用中,可以根據(jù)自己的需要來(lái)使用對(duì)應(yīng)的攔截方法。
客戶端攔截器
基于前面兩篇文章使用的Demo。
在客戶端項(xiàng)目新建一個(gè)類,命名為ClientLoggerInterceptor
,繼承攔截器基類Interceptor
。
我們?cè)谇懊媸褂玫腄emo,定義了擼貓服務(wù),其中SuckingCatAsync
方法為異步調(diào)用,所以我們重寫(xiě)攔截器的AsyncUnaryCall
方法
public class ClientLoggerInterceptor:Interceptor { public override AsyncUnaryCallAsyncUnaryCall ( TRequest request, ClientInterceptorContext context, AsyncUnaryCallContinuation continuation) { LogCall(context.Method); return continuation(request, context); } private void LogCall (Method method) where TRequest : class where TResponse : class { var initialColor = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine($"Starting call. Type: {method.Type}. Request: {typeof(TRequest)}. Response: {typeof(TResponse)}"); Console.ForegroundColor = initialColor; } }
注冊(cè)攔截器:
var channel = GrpcChannel.ForAddress("https://localhost:5001"); var invoker = channel.Intercept(new ClientLoggerInterceptor()); var catClient = new LuCat.LuCatClient(invoker); var catReply = await catClient.SuckingCatAsync(new Empty()); Console.WriteLine("調(diào)用擼貓服務(wù):"+ catReply.Message);
然后運(yùn)行:
可以看到成功的在客戶端攔截到了調(diào)用,并記錄了調(diào)用信息。
服務(wù)端攔截器
在服務(wù)端項(xiàng)目新建一個(gè)類,命名為ServerLoggerInterceptor
,繼承攔截器基類Interceptor
。
我們?cè)诜?wù)端需要實(shí)現(xiàn)的方法是UnaryServerHandler
public class ServerLoggerInterceptor: Interceptor { private readonly ILogger_logger; public ServerLoggerInterceptor(ILogger logger) { _logger = logger; } public override Task UnaryServerHandler ( TRequest request, ServerCallContext context, UnaryServerMethod continuation) { LogCall (MethodType.Unary, context); return continuation(request, context); } private void LogCall (MethodType methodType, ServerCallContext context) where TRequest : class where TResponse : class { _logger.LogWarning($"Starting call. Type: {methodType}. Request: {typeof(TRequest)}. Response: {typeof(TResponse)}"); } }
注冊(cè)攔截器:
public void ConfigureServices(IServiceCollection services) { services.AddGrpc(options => { options.Interceptors.Add(); }); }
運(yùn)行:
可以看到服務(wù)端成功攔截到了,客戶端的調(diào)用。
看完上述內(nèi)容,你們掌握怎么在ASP.NET中使用 gRPC攔截器的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!