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("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>();
  });
}

运行:

可以看到服务端成功拦截到了,客户端的调用。

五. 参考资料

.NET Core 上的 gRPC 的简介

本文Demo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 动态加载Js代码到Head标签中的脚本

    动态加载Js代码到Head标签中的脚本

    我遇到了这样的问题,请教google,结果大多数只是介绍那个注册js的几个函数,而这几个函数插入的js都在body里面,幸而在老外那里看到了这个代码,其实比较简单,但够有用
    2009-01-01
  • 关于.NET6 Minimal API的使用方式详解

    关于.NET6 Minimal API的使用方式详解

    本文我们主要是介绍了ASP.NET Core 6 Minimal API的常用的使用方式,在.NET6中也是默认的项目方式,整体来说却是非常的简单、简洁、强大、灵活,不得不说Minimal API却是在很多场景都非常适用的
    2021-12-12
  • asp.net 获取银行货币汇率的代码

    asp.net 获取银行货币汇率的代码

    这个主要公司做外贸的每天都需要更新汇率,本来以前有一个服务可以调用,但是那个连接用不了 所以就写了一个这样的东西 套取网页显示信息
    2010-12-12
  • Asp.net利用一般处理程序实现文件下载功能

    Asp.net利用一般处理程序实现文件下载功能

    这篇文章主要介绍了Asp.net利用一般处理程序实现文件下载功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-07-07
  • MVC4制作网站教程第四章 更新栏目4.3

    MVC4制作网站教程第四章 更新栏目4.3

    这篇文章主要为大家详细介绍了MVC4制作网站教程,更新栏目功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • asp.net(c#)实现从sqlserver存取二进制图片的代码

    asp.net(c#)实现从sqlserver存取二进制图片的代码

    有一个员工表Employee,需要保存员工照片(Photo)到数据库(sql server)上。员工照片对应的字段是varbinary(max),也就是要存成二进制文件类型(这和以前讨巧地存图片文件路径就不相同了),默认可以为空。
    2011-09-09
  • .Net基于MVC4 Web Api输出Json格式实例

    .Net基于MVC4 Web Api输出Json格式实例

    这篇文章主要介绍了.Net基于MVC4 Web Api输出Json格式的实现方法,实例讲述了Global中json的操作与XML的处理等技巧,需要的朋友可以参考下
    2014-10-10
  • .NET6打包部署到Windows Service的全过程

    .NET6打包部署到Windows Service的全过程

    net用了这么久,虽然多数都是部署在centos系统,但也有部署在windows上的情况,下面这篇文章主要给大家介绍了关于.NET6打包部署到Windows Service的相关资料,需要的朋友可以参考下
    2022-10-10
  • asp.net core 多文件分块同时上传的组件

    asp.net core 多文件分块同时上传的组件

    分享一个可多个文件同时上传、断点续传,并实时反馈上传进度的 Asp.Net core 组件,本文通过实例代码对asp.net core 多文件分块同时上传的组件知识介绍的非常详细,感兴趣的朋友一起看看吧
    2023-12-12
  • ASP.NET Core按用户等级授权的方法

    ASP.NET Core按用户等级授权的方法

    这篇文章主要介绍了ASP.NET Core按用户等级授权,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01

最新评论