首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#中的gRCP截取调用

C#中的gRCP截取调用
EN

Stack Overflow用户
提问于 2019-04-11 18:15:50
回答 2查看 5.5K关注 0票数 3

我在C# (NETCore)中使用gRPC。我想记录每个单独的方法调用,并且我希望有一些方法可以一次中断每个调用,而不是在每个服务方法上都有一个日志。没有找到如何,但不存在一些拦截器的策略?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-15 02:04:54

可以为客户端和服务器端定义您的自定义拦截器。在这两种情况下,您都需要创建一个继承自Interceptor类的新类,并覆盖您想要拦截的方法。因为客户端拦截器与整个客户端类相连。在服务器端,拦截器只为服务定义创建-这意味着如果你想拥有日志拦截器,你需要为每个服务定义指定它。此外,对于客户端,您可以使用已有的带Func的扩展方法作为参数,该参数可用于简单的拦截场景(我不会向您展示它的代码,因为我现在无法访问它)。

下面是一个简单的拦截器:

public class GlobalServerLoggerInterceptor : Interceptor
{
    private readonly ILogger logger;

    public GlobalServerLoggerInterceptor(ILogger logger)
    {
        this.logger = logger;
    }

    public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(TRequest request, ServerCallContext context, UnaryServerMethod<TRequest, TResponse> continuation)
    {
        logger.Debug($"{Environment.NewLine}GRPC Request{Environment.NewLine}Method: {context.Method}{Environment.NewLine}Data: {JsonConvert.SerializeObject(request, Formatting.Indented)}");

        var response = await base.UnaryServerHandler(request, context, continuation);

        logger.Debug($"{Environment.NewLine}GRPC Response{Environment.NewLine}Method: {context.Method}{Environment.NewLine}Data: {JsonConvert.SerializeObject(response, Formatting.Indented)}");

        return response;
    }
}

服务器端拦截器的初始化(伪代码):

   var server = new Grpc.Core.Server
            {
                Services =
                {

TestService.BindService(new TestImplementationService()).Intercept(IoC.Resolve<GlobalServerLoggerInterceptor>())
                },
                Ports = { new ServerPort("localhost", 1234, ServerCredentials.Insecure) }
            };

在上面的示例中,您可能会注意到这样的语句:

.Intercept(IoC.Resolve<GlobalServerLoggerInterceptor>())

如果您的拦截器需要一些其他类的引用,则需要在运行服务器之前对其进行初始化。

票数 6
EN

Stack Overflow用户

发布于 2021-04-15 16:17:55

要使用Grpc.Core创建客户端截取程序,可以执行以下操作:

var clientInterceptor = new YourClientInterceptor();
var channel = new Channel($"localhost", ChannelCredentials.Insecure);
var interceptingInvoker = channel.Intercept(clientInterceptor);
var client = new YourServiceClient(interceptingInvoker);

注意channel.Intercept(clientInterceptor)如何返回一个新的调用调用器,以便您将其传递给客户端。这是一个有点不直观的命名,但这就是我们目前的情况。

要拦截客户端调用,请让拦截器覆盖/实现所需的所有...Call方法,例如BlockingUnaryCall(...)AsyncUnaryCall(...)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55630096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档