Esempio n. 1
0
        internal static void CreateUnimplementedEndpoints(
            IEndpointRouteBuilder endpointRouteBuilder,
            ServiceMethodsRegistry serviceMethodsRegistry,
            ServerCallHandlerFactory <TService> serverCallHandlerFactory,
            List <MethodModel> serviceMethods)
        {
            // Return UNIMPLEMENTED status for missing service:
            // - /{service}/{method} + content-type header = grpc/application
            if (!serverCallHandlerFactory.IgnoreUnknownServices && serviceMethodsRegistry.Methods.Count == 0)
            {
                // Only one unimplemented service endpoint is needed for the application
                CreateUnimplementedEndpoint(endpointRouteBuilder, "{unimplementedService}/{unimplementedMethod}", "Unimplemented service", serverCallHandlerFactory.CreateUnimplementedService());
            }

            // Return UNIMPLEMENTED status for missing method:
            // - /Package.Service/{method} + content-type header = grpc/application
            if (!serverCallHandlerFactory.IgnoreUnknownMethods)
            {
                var serviceNames = serviceMethods.Select(m => m.Method.ServiceName).Distinct();

                // Typically there should be one service name for a type
                // In case the bind method sets up multiple services in one call we'll loop over them
                foreach (var serviceName in serviceNames)
                {
                    if (serviceMethodsRegistry.Methods.Any(m => string.Equals(m.Method.ServiceName, serviceName, StringComparison.Ordinal)))
                    {
                        // Only one unimplemented method endpoint is need for the service
                        continue;
                    }

                    CreateUnimplementedEndpoint(endpointRouteBuilder, serviceName + "/{unimplementedMethod}", $"Unimplemented method for {serviceName}", serverCallHandlerFactory.CreateUnimplementedMethod());
                }
            }
        }
Esempio n. 2
0
 public ServiceRouteBuilder(
     IEnumerable <IServiceMethodProvider <TService> > serviceMethodProviders,
     ServerCallHandlerFactory <TService> serverCallHandlerFactory,
     ServiceMethodsRegistry serviceMethodsRegistry,
     ILoggerFactory loggerFactory)
 {
     _serviceMethodProviders   = serviceMethodProviders.ToList();
     _serverCallHandlerFactory = serverCallHandlerFactory;
     _serviceMethodsRegistry   = serviceMethodsRegistry;
     _logger = loggerFactory.CreateLogger <ServiceRouteBuilder <TService> >();
 }
        public async Task OnServiceMethodDiscovery_ServiceWithDuplicateMethodNames_Success()
        {
            // Arrange
            var services = new ServiceCollection();

            services.AddSingleton <GreeterServiceWithDuplicateNames>();

            var serverCallHandlerFactory = new ServerCallHandlerFactory <GreeterServiceWithDuplicateNames>(
                NullLoggerFactory.Instance,
                Options.Create <GrpcServiceOptions>(new GrpcServiceOptions()),
                Options.Create <GrpcServiceOptions <GreeterServiceWithDuplicateNames> >(new GrpcServiceOptions <GreeterServiceWithDuplicateNames>()),
                new TestGrpcServiceActivator <GreeterServiceWithDuplicateNames>());

            var provider = new BinderServiceMethodProvider <GreeterServiceWithDuplicateNames>(NullLoggerFactory.Instance);
            var context  = new ServiceMethodProviderContext <GreeterServiceWithDuplicateNames>(serverCallHandlerFactory);

            var httpContext = HttpContextHelpers.CreateContext();

            httpContext.RequestServices = services.BuildServiceProvider();

            // Act
            provider.OnServiceMethodDiscovery(context);

            // Assert
            Assert.AreEqual(2, context.Methods.Count);

            var methodModel = context.Methods[0];

            Assert.AreEqual("SayHello", methodModel.Method.Name);

            var ms = new MemoryStream();

            MessageHelpers.WriteMessage(ms, new HelloRequest
            {
                Name = "World"
            });
            ms.Seek(0, SeekOrigin.Begin);
            httpContext.Request.Body = ms;

            await methodModel.RequestDelegate(httpContext);

            // Expect 12 (unimplemented) from base type
            Assert.AreEqual("12", httpContext.Response.Headers["grpc-status"]);
        }
Esempio n. 4
0
 internal ServiceMethodProviderContext(ServerCallHandlerFactory <TService> serverCallHandlerFactory)
 {
     Methods = new List <MethodModel>();
     _serverCallHandlerFactory = serverCallHandlerFactory;
 }