ASP.NET Core 3.0 gRPC拦截器的使用
更新时间:2019年12月23日 14:48:57 作者:晓晨Master
这篇文章主要介绍了ASP.NET Core 3.0 gRPC拦截器的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
一. 前言
前面两篇文章给大家介绍了使用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(“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>();
});
}
运行:
可以看到服务端成功拦截到了,客户端的调用。
五. 参考资料
.NET Core 上的 gRPC 的简介
本文Demo
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持华域联盟。
您可能感兴趣的文章:.Net Core中使用Grpc的方法ASP.NET Core 3.0使用gRPC的具体方法图析ASP.NET Core引入gRPC服务模板如何在.NET Core中为gRPC服务设计消息文件(Proto)
ASP.NET
Core
gRPC
拦截器
相关文章
asp.net 获取客户端浏览器访问的IP地址的实例代码本篇文章主要介绍了asp.net 获取客户端浏览器访问的IP地址的实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2017-07-07
关于asp.net button按钮的OnClick和OnClientClick事件OnClick是button的服务器端事件 OnClientClick是button的客户端事件
2009-05-05
EasyUI Tree+Asp.net实现权限树或目录树导航的简单实例本篇文章主要是对EasyUI Tree+Asp.net实现权限树或目录树导航的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 2014-02-02
.Net多线程编程(误用点分析)本文主要介绍了.Net多线程编程中的误用点分析。具有一定的参考价值,下面跟着小编一起来看下吧 2017-01-01
ASP.NET实现QQ、微信、新浪微博OAuth2.0授权登录本文主要介绍了QQ、微信、新浪微博OAuth2.0授权登录的示例,主要就是GET、POST远程接口,返回相应的数据,这里列出相关的代码,供大家参考。 2016-03-03
如何使用pm2守护你的.NET Core应用程序详解pm2是nodejs的一个带有负载均衡功能的应用进程管理器的模块,下面这篇文章主要给大家介绍了关于如何使用pm2守护你的.NET Core应用程序的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下 2018-10-10
C# 文件上传 默认最大为4M的解决方法.net中默只能上传小于4m的文件,大于4M将无法显示页面.那么如何设置来使imputfile能上传更大的文件呢 2008-11-11
如何给asp.net core写个中间件记录接口耗时这篇文章主要给大家介绍了关于如何给asp.net core写个中间件记录接口耗时的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用asp.net core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 2019-09-09
asp.net使用母版页中使用ajax脚本取数据因母版页继承自UserControl,我们无法像正常页面那样使用Jquey或Ajax的PageMethods等无刷新方法取数据。不过可以使用ajax提供的Sys.Net.WebRequest来解决这一问题。
2010-09-09
MVC4制作网站教程第四章 浏览栏目4.2这篇文章主要为大家详细介绍了MVC4制作网站教程,浏览栏目功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 2016-08-08
最新评论

评论(0)