Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# gRCP在C中拦截调用_C#_Grpc - Fatal编程技术网

C# gRCP在C中拦截调用

C# gRCP在C中拦截调用,c#,grpc,C#,Grpc,我在C NETCore中使用gRPC。我希望记录每个方法调用,并且我希望有某种方法可以一次对每个调用进行交换,而不是对每个服务方法进行记录。找不到如何使用,但不存在某种拦截器策略?可以为客户端和服务器端定义自定义拦截器。在这两种情况下,您都需要创建一个新类,该类继承自类并重写要截取的方法。因为客户端拦截器与整个客户端类连接。在服务器端,拦截器只是为服务定义创建的——这意味着,如果您想拥有日志拦截器,您需要为每个服务定义指定它。此外,对于客户端,您可以使用一个已经可用的扩展方法,并将Func作为参

我在C NETCore中使用gRPC。我希望记录每个方法调用,并且我希望有某种方法可以一次对每个调用进行交换,而不是对每个服务方法进行记录。找不到如何使用,但不存在某种拦截器策略?

可以为客户端和服务器端定义自定义拦截器。在这两种情况下,您都需要创建一个新类,该类继承自类并重写要截取的方法。因为客户端拦截器与整个客户端类连接。在服务器端,拦截器只是为服务定义创建的——这意味着,如果您想拥有日志拦截器,您需要为每个服务定义指定它。此外,对于客户端,您可以使用一个已经可用的扩展方法,并将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>())

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

可以为客户端和服务器端定义自定义拦截器。在这两种情况下,您都需要创建一个新类,该类继承自类并重写要截取的方法。因为客户端拦截器与整个客户端类连接。在服务器端,拦截器只是为服务定义创建的——这意味着,如果您想拥有日志拦截器,您需要为每个服务定义指定它。此外,对于客户端,您可以使用一个已经可用的扩展方法,并将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>())

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

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

var clientInterceptor = new YourClientInterceptor();
var channel = new Channel($"localhost", ChannelCredentials.Insecure);
var interceptingInvoker = channel.Intercept(clientInterceptor);
var client = = new YourServiceClient(interceptingInvoker);
请注意channel.InterceptclientInterceptor如何返回一个新的调用调用程序,以便传递给客户端。这里的命名有点不直观,但这就是我们现在所拥有的


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

要使用Grpc.Core创建客户端侦听器,可以执行以下操作:

var clientInterceptor = new YourClientInterceptor();
var channel = new Channel($"localhost", ChannelCredentials.Insecure);
var interceptingInvoker = channel.Intercept(clientInterceptor);
var client = = new YourServiceClient(interceptingInvoker);
请注意channel.InterceptclientInterceptor如何返回一个新的调用调用程序,以便传递给客户端。这里的命名有点不直观,但这就是我们现在所拥有的


要拦截客户端调用,请让拦截器覆盖/实现您需要的所有…调用方法,例如BlockingUnaryCall。。。还有AsyncUnaryCall…

您好,您找到如何使拦截器工作了吗?我需要类似的东西。Thanks@VAAA2019年4月,没有文章和其他来源可以阅读,所以我对gRPC C源代码进行了分析;嗨,你找到如何使拦截器工作了吗?我需要类似的东西。Thanks@VAAA2019年4月,没有文章和其他来源可以阅读,所以我对gRPC C源代码进行了分析;