ASP.NET Core 3.0 gRPC拦截器的使用
一.前言
前面两篇文章给大家介绍了使用gRPC的入门以及双向流的使用,今天介绍的是gRPC中的拦截器。拦截器就像MVC的过滤器或者是ASP.NETCoremiddleware一样,具有面向切面的思想,可以在调用服务的时候进行一些统一处理,很适合在这里处理验证、日志等流程。本片文章就以记录日志为例来进行讲解。
二.Interceptor类介绍
Interceptor类是gRPC服务拦截器的基类,是一个抽象类,它定了几个虚方法,分别如下:
publicvirtualTResponseBlockingUnaryCall(); publicvirtualAsyncUnaryCall AsyncUnaryCall (); publicvirtualAsyncServerStreamingCall AsyncServerStreamingCall (); publicvirtualAsyncClientStreamingCall AsyncClientStreamingCall (); publicvirtualAsyncDuplexStreamingCall AsyncDuplexStreamingCall (); publicvirtualTask UnaryServerHandler (); publicvirtualTask ClientStreamingServerHandler (); publicvirtualTaskServerStreamingServerHandler (); publicvirtualTaskDuplexStreamingServerHandler ();
各个方法作用如下:
方法名称 | 作用 |
---|---|
BlockingUnaryCall | 拦截阻塞调用 |
AsyncUnaryCall | 拦截异步调用 |
AsyncServerStreamingCall | 拦截异步服务端流调用 |
AsyncClientStreamingCall | 拦截异步客户端流调用 |
AsyncDuplexStreamingCall | 拦截异步双向流调用 |
UnaryServerHandler | 用于拦截和传入普通调用服务器端处理程序 |
ClientStreamingServerHandler | 用于拦截客户端流调用的服务器端处理程序 |
ServerStreamingServerHandler | 用于拦截服务端流调用的服务器端处理程序 |
DuplexStreamingServerHandler | 用于拦截双向流调用的服务器端处理程序 |
在实际使用中,可以根据自己的需要来使用对应的拦截方法。
三.客户端拦截器
基于前面两篇文章使用的Demo。
在客户端项目新建一个类,命名为ClientLoggerInterceptor,继承拦截器基类Interceptor。
我们在前面使用的Demo,定义了撸猫服务,其中SuckingCatAsync方法为异步调用,所以我们重写拦截器的AsyncUnaryCall方法
publicclassClientLoggerInterceptor:Interceptor { publicoverrideAsyncUnaryCallAsyncUnaryCall ( TRequestrequest, ClientInterceptorContext context, AsyncUnaryCallContinuation continuation) { LogCall(context.Method); returncontinuation(request,context); } privatevoidLogCall (Method method) whereTRequest:class whereTResponse:class { varinitialColor=Console.ForegroundColor; Console.ForegroundColor=ConsoleColor.Green; Console.WriteLine($"Startingcall.Type:{method.Type}.Request:{typeof(TRequest)}.Response:{typeof(TResponse)}"); Console.ForegroundColor=initialColor; } }
注册拦截器:
varchannel=GrpcChannel.ForAddress("https://localhost:5001"); varinvoker=channel.Intercept(newClientLoggerInterceptor()); varcatClient=newLuCat.LuCatClient(invoker); varcatReply=awaitcatClient.SuckingCatAsync(newEmpty()); Console.WriteLine("调用撸猫服务:"+catReply.Message);
然后运行:
可以看到成功的在客户端拦截到了调用,并记录了调用信息。
四.服务端拦截器
在服务端项目新建一个类,命名为ServerLoggerInterceptor,继承拦截器基类Interceptor。
我们在服务端需要实现的方法是UnaryServerHandler
publicclassServerLoggerInterceptor:Interceptor { privatereadonlyILogger_logger; publicServerLoggerInterceptor(ILogger logger) { _logger=logger; } publicoverrideTask UnaryServerHandler ( TRequestrequest, ServerCallContextcontext, UnaryServerMethod continuation) { LogCall (MethodType.Unary,context); returncontinuation(request,context); } privatevoidLogCall (MethodTypemethodType,ServerCallContextcontext) whereTRequest:class whereTResponse:class { _logger.LogWarning($"Startingcall.Type:{methodType}.Request:{typeof(TRequest)}.Response:{typeof(TResponse)}"); } }
注册拦截器:
publicvoidConfigureServices(IServiceCollectionservices) { services.AddGrpc(options=> { options.Interceptors.Add(); }); }
运行:
可以看到服务端成功拦截到了,客户端的调用。
五.参考资料
.NETCore上的gRPC的简介
本文Demo
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。