怎么在ASP.NET中使用gRPC拦截器-创新互联

怎么在ASP.NET中使用 gRPC拦截器?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

创新互联服务项目包括西和网站建设、西和网站制作、西和网页制作以及西和网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,西和网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到西和省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

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拦截器

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

看完上述内容,你们掌握怎么在ASP.NET中使用 gRPC拦截器的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!


文章名称:怎么在ASP.NET中使用gRPC拦截器-创新互联
当前链接:http://scyanting.com/article/dcssoi.html