怎么在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);然后运行:

可以看到成功的在客户端拦截到了调用,并记录了调用信息。
服务端拦截器
在服务端项目新建一个类,命名为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拦截器-创新互联
新闻来源:http://www.jxjierui.cn/article/dcssoi.html


咨询
建站咨询
