ASP.NET Core gRPC로 필터 같은 걸 하고 싶은데

ASP.NET Core gRPC에서 모든 서비스를 호출하기 전에 공동 처리에 가입하고 싶습니다!!이럴 땐 ASPNET Core MVC 같은 필터 같은 거 없나요?그렇게 생각하다가 찾아봤는데 인터셉터라는 게 있더라고요.클라이언트와 서버 쪽의 인터셉터가 있는 것 같아서 이번에는 서버 쪽을 만들어 보았습니다.
그나저나 좀 오래된 기사지만 구글에서는 이렇게 사용할 수 있을 것 같아요.
https://soichisumi.net/2019/12/grpc-interceptor-method-setting/
ASP.NET Core gRPC의 경우 Startup.csConfigureServicesservices.AddGrpc에서 호출된 곳에서 옵션을 구성하는 리셋이 있습니다. 거기에서Interceptor를 설정할 수 있습니다.
인터셉터는 이름에 따라 계승 제작Grpc.Core.Interceptors.Interceptor하여 전처리와 후처리를 하고자 하는 방법을 다시 쓴다.
순수한 클라이언트에서 서버 방법을 읽고 결과를 되돌려 주는 형식 UnaryServerHandler 이라면, 다시 쓰는 방법입니다.예를 들어 호출하기 전에 로그를 제출할 때 다음 Interceptor를 만듭니다.
LoggingInterceptor.cs
class LoggingInterceptor : Interceptor
{
    private readonly ILogger<LoggingInterceptor> logger;

    public LoggingInterceptor(ILogger<LoggingInterceptor> logger)
    {
        this.logger = logger;
    }

    public override Task<TResponse> UnaryServerHandler<TRequest, TResponse>(TRequest request, ServerCallContext context, UnaryServerMethod<TRequest, TResponse> continuation)
    {
        this.logger.LogInformation($"★ {context.Host}, {context.Method}");
        return base.UnaryServerHandler(request, context, continuation);
    }
}
ServerCallContext의 Method에는 /greet.Greeter/SayHello라는 값이 포함되어 있기 때문에 각 방법을 고유하게 처리하려면 여기를 보고 처리한다.
이 문자열에서 특정 대상의 분류를 보면 속성을 핥아서 다양한 일을 할 수 있다.(이런 메커니즘은 원래 있는 건가?)
Request 매개 변수에는 실제로 고객이 호출할 때 건네주는 대상이 포함되어 있지만 이 서명은 Object형을 처리하는 것과 다를 것이 없기 때문에 Method가 적시에 캐릭터를 분배하는 것을 보고 싶습니다.
이 인터셉터ConfigureServices를 등록하려면 다음과 같은 방법으로 AddGrpcoptions에서 Interceptors에 등록할 수 있다.
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc(options =>
    {
        options.Interceptors.Add<LoggingInterceptor>();
    });
}
이 Interceptor를 추가한 상태에서 서비스를 호출하면 다음 로그가 나타납니다.
info: GrpcService1.LoggingInterceptor[0]
      ★ localhost:5001, /greet.Greeter/SayHello

좋은 웹페이지 즐겨찾기