ASP.NET Core 3.0 gRPC攔截器的使用
一. 前言
前面兩篇文章給大家介紹了使用gRPC的入門以及雙向流的使用,今天介紹的是gRPC中的攔截器。攔截器就像MVC的過濾器或者是ASP.NET Core middleware 一樣,具有面向切面的思想,可以在調用服務的時候進行一些統(tǒng)一處理, 很適合在這里處理驗證、日志等流程。本片文章就以記錄日志為例來進行講解。
二. 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 | 用于攔截雙向流調用的服務器端處理程序 |
在實際使用中,可以根據(jù)自己的需要來使用對應的攔截方法。
三. 客戶端攔截器
基于前面兩篇文章使用的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。
我們在服務端需要實現(xiàn)的方法是 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 認證系統(tǒng)源碼解析
欄 目:ASP.NET
下一篇:ASP.NET Core3.X 終端中間件轉換為端點路由運行詳解
本文標題:ASP.NET Core 3.0 gRPC攔截器的使用
本文地址:http://www.jygsgssxh.com/a1/ASP_NET/10819.html
您可能感興趣的文章
- 01-11如何給asp.net core寫個簡單的健康檢查
- 01-11淺析.Net Core中Json配置的自動更新
- 01-11.net core高吞吐遠程方法如何調用組件XRPC詳解
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其妙的超時
- 01-11docker部署Asp.net core應用的完整步驟
- 01-11.net core webapi jwt 更為清爽的認證詳解
- 01-11ASP.NET Core靜態(tài)文件的使用方法
- 01-11.NET Core 3.0之創(chuàng)建基于Consul的Configuration擴展組件
- 01-11.net core EF Core調用存儲過程的方式
- 01-11asp.net Core3.0區(qū)域與路由配置的方法


閱讀排行
本欄相關
- 01-11vscode extension插件開發(fā)詳解
- 01-11VsCode插件開發(fā)之插件初步通信的方法
- 01-11如何給asp.net core寫個簡單的健康檢查
- 01-11.net core高吞吐遠程方法如何調用組件
- 01-11淺析.Net Core中Json配置的自動更新
- 01-11.NET開發(fā)人員關于ML.NET的入門學習
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其
- 01-11.net core webapi jwt 更為清爽的認證詳解
- 01-11docker部署Asp.net core應用的完整步驟
- 01-11ASP.NET Core靜態(tài)文件的使用方法
隨機閱讀
- 01-10C#中split用法實例總結
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05織夢dedecms什么時候用欄目交叉功能?


