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()); } } }
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"]); }
internal ServiceMethodProviderContext(ServerCallHandlerFactory <TService> serverCallHandlerFactory) { Methods = new List <MethodModel>(); _serverCallHandlerFactory = serverCallHandlerFactory; }