怎么在ASP.NET中使用 gRPC拦截器
创始人
2024-11-27 11:47:20
0次

Interceptor 类介绍

Interceptor类是gRPC服务拦截器的基类,是一个抽象类,它定了几个虚方法,分别如下:

public virtual TResponse BlockingUnaryCall();
public virtual AsyncUnaryCall AsyncUnaryCall();
public virtual AsyncServerStreamingCall AsyncServerStreamingCall();
public virtual AsyncClientStreamingCall AsyncClientStreamingCall();
public virtual AsyncDuplexStreamingCall AsyncDuplexStreamingCall();
public virtual Task UnaryServerHandler();
public virtual Task ClientStreamingServerHandler();
public virtual Task ServerStreamingServerHandler();
public virtual Task DuplexStreamingServerHandler();

各个方法作用如下:


方法名称作用
BlockingUnaryCall拦截阻塞调用
AsyncUnaryCall拦截异步调用
AsyncServerStreamingCall拦截异步服务端流调用
AsyncClientStreamingCall拦截异步客户端流调用
AsyncDuplexStreamingCall拦截异步双向流调用
UnaryServerHandler用于拦截和传入普通调用服务器端处理程序
ClientStreamingServerHandler用于拦截客户端流调用的服务器端处理程序
ServerStreamingServerHandler用于拦截服务端流调用的服务器端处理程序
DuplexStreamingServerHandler用于拦截双向流调用的服务器端处理程序

在实际使用中,可以根据自己的需要来使用对应的拦截方法。

客户端拦截器

基于前面两篇文章使用的Demo。

在客户端项目新建一个类,命名为 ClientLoggerInterceptor,继承拦截器基类 Interceptor。

我们在前面使用的Demo,定义了撸猫服务,其中 SuckingCatAsync方法为异步调用,所以我们重写拦截器的 AsyncUnaryCall方法

public class ClientLoggerInterceptor:Interceptor
{
  public override AsyncUnaryCall AsyncUnaryCall(
    TRequest request,
    ClientInterceptorContext context,
    AsyncUnaryCallContinuation continuation)
  {
    LogCall(context.Method);

    return continuation(request, context);
  }

  private void LogCall(Method 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);

然后运行:

怎么在ASP.NET中使用 gRPC拦截器

可以看到成功的在客户端拦截到了调用,并记录了调用信息。

服务端拦截器

在服务端项目新建一个类,命名为 ServerLoggerInterceptor,继承拦截器基类 Interceptor。

我们在服务端需要实现的方法是 UnaryServerHandler

public class ServerLoggerInterceptor: Interceptor
{
  private readonly ILogger _logger;

  public ServerLoggerInterceptor(ILogger logger)
  {
    _logger = logger;
  }

  public override Task UnaryServerHandler(
    TRequest request,
    ServerCallContext context,
    UnaryServerMethod continuation)
  {
    LogCall(MethodType.Unary, context);
    return continuation(request, context);
  }

  private void LogCall(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();
  });
}

运行:

怎么在ASP.NET中使用 gRPC拦截器

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

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...