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