ASP.NET Core 3.0 gRPC拦截器的使用
2019-12-24 12:10
1711 查看
一. 前言
前面两篇文章给大家介绍了使用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 3.0中使用swagger的方法与问题
- 使用asp.net core 3.0 搭建智能小车2
- asp.netcore3.0 netstandard2.1 使用 DbProviderFactories 连接数据库
- 2019年第一天——使用Visual Studio 2019 Preview创建第一个ASP.Net Core3.0的App
- ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用
- 使用asp.net core 3.0 搭建智能小车1
- ASP.NET Core 3.0中使用动态控制器路由
- ASP.NET MVC 3.0(十一): MVC 3.0 使用筛选器
- 我要学ASP.NET MVC 3.0(十九): MVC 3.0 实例之使用开源控件实现表格排序和分页
- asp.net core 使用protobuf
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(一)-- 起步
- ASP.NET Core Kestrel 中使用 HTTPS (SSL)
- 使用 dotnet watch 开发 ASP.NET Core 应用程序
- 我要学ASP.NET MVC 3.0(十一): MVC 3.0 使用筛选器
- asp.net core 使用EF7 Code First 创建数据库,同时使用命令创建数据库
- ASP.NET Core开发-使用Nancy框架
- Asp.net Core 使用Redis存储Session
- ASP.NET Core 中文文档 第二章 指南 (09) 使用 Swagger 生成 ASP.NET Web API 在线帮助测试文档
- Asp.Net Core 项目搭建 基础配置 和MySql 的使用
- 在ASP.NET Core中使用Angular2,以及与Angular2的Token base身份认证