ASP.NET Core 3.0 gRPC攔截器的使用

 更新時間:2020-01-25 00:02:20   作者:佚名   我要評論(0)

一. 前言
前面兩篇文章給大家介紹了使用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>();
  });
}

運行:

可以看到服務端成功攔截到了,客戶端的調用。

五. 參考資料

.NET Core 上的 gRPC 的簡介

本文Demo

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

  • Asp.Net Core Identity 隱私數據保護的實現
  • .Net Core3 用Windows 桌面應用開發Asp.Net Core網站
  • ASP.NET Core 3.0使用gRPC的具體方法
  • 淺談ASP.NET Core的幾種托管方式
  • asp.net core 授權詳解

相關文章

  • ASP.NET Core 3.0 gRPC攔截器的使用

    ASP.NET Core 3.0 gRPC攔截器的使用

    一. 前言 前面兩篇文章給大家介紹了使用gRPC的入門以及雙向流的使用,今天介紹的是gRPC中的攔截器。攔截器就像MVC的過濾器或者是ASP.NET Core middleware 一樣,具有
    2020-01-25
  • ASP.NET MVC中使用log4net的實現示例

    ASP.NET MVC中使用log4net的實現示例

    今天自己要弄一個日志記錄功能,以前也弄過 但是都忘了,今天又弄了一下 花了幾十分鐘,在此記錄一下 第一步:添加log4net.dll 第二步:配置 示例如下: 我是直接配
    2020-01-25
  • 3分鐘快速學會在ASP.NET Core MVC中如何使用Cookie

    3分鐘快速學會在ASP.NET Core MVC中如何使用Cookie

    一.Cookie是什么? 我的朋友問我cookie是什么,用來干什么的,可是我居然無法清楚明白簡短地向其闡述cookie,這不禁讓我陷入了沉思:為什么我無法解釋清楚,我對
    2020-01-25
  • ASP.Net Core3.0中使用JWT認證的實現

    ASP.Net Core3.0中使用JWT認證的實現

    JWT認證簡單介紹 關于Jwt的介紹網上很多,此處不在贅述,我們主要看看jwt的結構。 JWT主要由三部分組成,如下: HEADER.PAYLOAD.SIGNATURE HEADER 包含token的元
    2020-01-25
  • DataReader不能使用using的詳細示例

    DataReader不能使用using的詳細示例

    本文介紹了DataReader不能使用using的詳細示例,分享給大家,具有如下: public static MySqlDataReader ExecuteMySqlReader(string sqlStr) { MySqlConnection c
    2020-01-25
  • asp.net MVC 在Controller控制器中實現驗證碼輸出功能

    asp.net MVC 在Controller控制器中實現驗證碼輸出功能

    asp.net mvc項目使用到驗證碼,為了讓以前的WebForm代碼能利用上代碼經過稍微的改動即可使用代碼如下: using System; using System.Collections.Generic; usin
    2020-01-25
  • 淺談.Net Core 認證系統源碼解析

    淺談.Net Core 認證系統源碼解析

    不知不覺.Net Core已經推出到3.1了,大多數以.Net為技術棧的公司也開始逐步的切換到了Core,從業也快3年多了,一直堅持著.不管環境怎么變,堅持自己的當初的選擇,堅持信
    2020-01-25
  • .NET連接池的問題詳解

    .NET連接池的問題詳解

    NET 連接池救生員 防止可淹沒應用程序的池溢出 William Vaughn 大多數 ADO.NET 數據提供程序使用連接池,以提高圍繞 Microsoft 斷開連接的 .NET 結構構建的應用程序
    2020-01-25
  • .Net獲取IP地址的方法

    .Net獲取IP地址的方法

    獲取本機IP 2.獲取網頁客戶端IP /// <summary> /// 獲取IPv4地址 /// </summary> /// <returns> </returns> public static string G
    2020-01-25
  • ASP.NET Core 3框架揭秘之 異步線程無法使用IServiceProvider問題

    ASP.NET Core 3框架揭秘之 異步線程無法使用IServiceProvider問題

    標題反映的是上周五一個同事咨詢我的問題,我覺得這是一個很好的問題。這個問題有助于我們深入理解依賴注入框架在ASP.NET Core中的應用,以及服務實例的生命周期。
    2020-01-25

最新評論

老快3投注技巧 20选5复式计算表 山西11选五5 广西双彩24选7的走势图 大乐透玩法中奖规则 贵州11选5五码遗漏 体育彩票中奖的人 股票交易软件 快3玩法qicp—me 吉林快三图表 股票软件app下载排名 重庆快乐十分钟开奖走势图 上海11选5走势图开奖完整版 陕西快乐10分怎么玩 极速时时彩每天几点开 pk10赛车计划软件下载 甘肃快三走势图甘肃快三走势图一定牛