ASP.NET Core 3.0 gRPC拦截器的使用
程序员文章站
2022-03-07 14:01:25
一. 前言
前面两篇文章给大家介绍了使用grpc的入门以及双向流的使用,今天介绍的是grpc中的拦截器。拦截器就像mvc的过滤器或者是asp.net core middleware...
一. 前言
前面两篇文章给大家介绍了使用grpc的入门以及双向流的使用,今天介绍的是grpc中的拦截器。拦截器就像mvc的过滤器或者是asp.net core middleware 一样,具有面向切面的思想,可以在调用服务的时候进行一些统一处理, 很适合在这里处理验证、日志等流程。本片文章就以记录日志为例来进行讲解。
二. interceptor 类介绍
interceptor
类是grpc服务拦截器的基类,是一个抽象类,它定了几个虚方法,分别如下:
public virtual tresponse blockingunarycall<trequest, tresponse>(); public virtual asyncunarycall<tresponse> asyncunarycall<trequest, tresponse>(); public virtual asyncserverstreamingcall<tresponse> asyncserverstreamingcall<trequest, tresponse>(); public virtual asyncclientstreamingcall<trequest, tresponse> asyncclientstreamingcall<trequest, tresponse>(); public virtual asyncduplexstreamingcall<trequest, tresponse> asyncduplexstreamingcall<trequest, tresponse>(); public virtual task<tresponse> unaryserverhandler<trequest, tresponse>(); public virtual task<tresponse> clientstreamingserverhandler<trequest, tresponse>(); public virtual task serverstreamingserverhandler<trequest, tresponse>(); public virtual task duplexstreamingserverhandler<trequest, tresponse>();
各个方法作用如下:
方法名称 | 作用 |
---|---|
blockingunarycall | 拦截阻塞调用 |
asyncunarycall | 拦截异步调用 |
asyncserverstreamingcall | 拦截异步服务端流调用 |
asyncclientstreamingcall | 拦截异步客户端流调用 |
asyncduplexstreamingcall | 拦截异步双向流调用 |
unaryserverhandler | 用于拦截和传入普通调用服务器端处理程序 |
clientstreamingserverhandler | 用于拦截客户端流调用的服务器端处理程序 |
serverstreamingserverhandler | 用于拦截服务端流调用的服务器端处理程序 |
duplexstreamingserverhandler | 用于拦截双向流调用的服务器端处理程序 |
在实际使用中,可以根据自己的需要来使用对应的拦截方法。
三. 客户端拦截器
基于前面两篇文章使用的demo。
在客户端项目新建一个类,命名为 clientloggerinterceptor
,继承拦截器基类 interceptor
。
我们在前面使用的demo,定义了撸猫服务,其中 suckingcatasync
方法为异步调用,所以我们重写拦截器的 asyncunarycall
方法
public class clientloggerinterceptor:interceptor { public override asyncunarycall<tresponse> asyncunarycall<trequest, tresponse>( trequest request, clientinterceptorcontext<trequest, tresponse> context, asyncunarycallcontinuation<trequest, tresponse> continuation) { logcall(context.method); return continuation(request, context); } private void logcall<trequest, tresponse>(method<trequest, tresponse> 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; } }
注册拦截器:
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("调用撸猫服务:"+ catreply.message);
然后运行:
可以看到成功的在客户端拦截到了调用,并记录了调用信息。
四. 服务端拦截器
在服务端项目新建一个类,命名为 serverloggerinterceptor
,继承拦截器基类 interceptor
。
我们在服务端需要实现的方法是 unaryserverhandler
public class serverloggerinterceptor: interceptor { private readonly ilogger<serverloggerinterceptor> _logger; public serverloggerinterceptor(ilogger<serverloggerinterceptor> logger) { _logger = logger; } public override task<tresponse> unaryserverhandler<trequest, tresponse>( trequest request, servercallcontext context, unaryservermethod<trequest, tresponse> continuation) { logcall<trequest, tresponse>(methodtype.unary, context); return continuation(request, context); } private void logcall<trequest, tresponse>(methodtype methodtype, servercallcontext context) where trequest : class where tresponse : class { _logger.logwarning($"starting call. type: {methodtype}. request: {typeof(trequest)}. response: {typeof(tresponse)}"); } }
注册拦截器:
public void configureservices(iservicecollection services) { services.addgrpc(options => { options.interceptors.add<serverloggerinterceptor>(); }); }
运行:
可以看到服务端成功拦截到了,客户端的调用。
五. 参考资料
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
ASP.Net Core中使用枚举类而不是枚举的方法
-
创建基于ASP.NET core 3.1 的RazorPagesMovie项目(一)-创建和使用默认的模板
-
使用NuGet将我们的ASP.NET Core类库打包并将程序包(类库)发布到NuGet平台上进行管理
-
asp.net core 3.0 中使用 swagger
-
在.NET Core 3.0中的WPF中使用IOC图文教程
-
在 ASP.NET Core 项目中使用 npm 管理你的前端组件包
-
[翻译] ASP.NET Core 3.0 的新增功能
-
ASP.NET Core 3.0 使用AspectCore-Framework实现AOP
-
或许是你应该了解的一些 ASP.NET Core Web API 使用小技巧
-
.NET Core 3.0预览版7中的ASP.NET Core和Blazor更新