| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 | // Copyright 2020 The gRPC Authors//// Licensed under the Apache License, Version 2.0 (the "License");// you may not use this file except in compliance with the License.// You may obtain a copy of the License at////     http://www.apache.org/licenses/LICENSE-2.0//// Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS IS" BASIS,// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.// See the License for the specific language governing permissions and// limitations under the License.using System;using System.Net;using System.Threading.Tasks;using Grpc.Core;using Grpc.HealthCheck;using Helloworld;using Grpc.Health;using Grpc.Health.V1;using Grpc.Reflection;using Grpc.Reflection.V1Alpha;using CommandLine;namespace GreeterServer{    class GreeterImpl : Greeter.GreeterBase    {        private string hostname;        public GreeterImpl(string hostname)        {            this.hostname = hostname;        }        // Server side handler of the SayHello RPC        public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)        {            return Task.FromResult(new HelloReply { Message = $"Hello {request.Name} from {hostname}!"});        }    }    class Program    {        class Options        {            [Option("port", Default = 50051, HelpText = "The port to listen on.")]            public int Port { get; set; }            [Option("hostname", Required = false, HelpText = "The name clients will see in responses. If not specified, machine's hostname will obtain automatically.")]            public string Hostname { get; set; }        }        public static void Main(string[] args)        {            Parser.Default.ParseArguments<Options>(args)                   .WithParsed<Options>(options => RunServer(options));        }        private static void RunServer(Options options)        {            var hostName = options.Hostname ?? Dns.GetHostName();            var serviceDescriptors = new [] {Greeter.Descriptor, Health.Descriptor, ServerReflection.Descriptor};            var greeterImpl = new GreeterImpl(hostName);            var healthServiceImpl = new HealthServiceImpl();            var reflectionImpl = new ReflectionServiceImpl(serviceDescriptors);            Server server = new Server            {                Services = { Greeter.BindService(greeterImpl), Health.BindService(healthServiceImpl), ServerReflection.BindService(reflectionImpl) },                Ports = { new ServerPort("[::]", options.Port, ServerCredentials.Insecure) }            };            server.Start();            // Mark all services as healthy.            foreach (var serviceDescriptor in serviceDescriptors)            {                healthServiceImpl.SetStatus(serviceDescriptor.FullName, HealthCheckResponse.Types.ServingStatus.Serving);            }            // Mark overall server status as healthy.            healthServiceImpl.SetStatus("", HealthCheckResponse.Types.ServingStatus.Serving);            Console.WriteLine("Greeter server listening on port " + options.Port);            Console.WriteLine("Press any key to stop the server...");            Console.ReadKey();            server.ShutdownAsync().Wait();        }    }}
 |