перехват вызовов gRCP в C # - PullRequest
0 голосов
/ 11 апреля 2019

Я использую gRPC в C # (NETCore). Я хотел бы регистрировать каждый отдельный вызов метода, и я ожидаю, что у меня будет возможность каким-то образом перехватывать каждый вызов вместо того, чтобы помещать журнал в каждый метод службы. Не нашли как, но не существует какой-то стратегии перехватчика?

1 Ответ

1 голос
/ 14 апреля 2019

Возможно определить ваш собственный перехватчик для клиента и стороны сервера. В обоих случаях вам нужно создать новый класс, который наследует класс 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>())

Если вашему перехватчику нужна ссылка на некоторые другие классы, вам нужно инициализировать их перед запуском сервера.

...