Можете ли вы запустить asp. net core 3.0 gRP C CLIENT в IIS? (возможно на Azure?) - PullRequest
0 голосов
/ 17 марта 2020

Я прочитал много противоречивой информации об этом, и кажется, что люди не на 100% ясно понимают, что возможно, а что нет. Я уверен, что вы не можете разместить серверное приложение gRP C в IIS из-за ограничений HTTP / 2. Документация довольно понятна. Тем не менее, я хочу использовать IIS в качестве обратного прокси-сервера, а внутренняя сторона взаимодействует с помощью gRP C. Таким образом, клиент будет в IIS, не сервер . Я предположил, что, поскольку связь на этом этапе (т. Е. Серверная часть) не передавалась через IIS, с этим не было бы никаких проблем. Однако я продолжаю видеть смешанные ответы.

Я создал тупое веб-приложение, которое размещено в IIS Express и может успешно публиковать в своем сервисе, работающем на Kestrel с gRP C.

Пример кода клиента ниже. SubmitButton - это просто сообщение формы на странице бритвы.

        public async void OnPostSubmitButton()
        {
            // The port number(5001) must match the port of the gRPC server.
            using var channel = GrpcChannel.ForAddress("https://localhost:5001");
            var client = new Greeter.GreeterClient(channel);
            var reply = await client.SayHelloAsync(
                              new HelloRequest { Name = "GreeterClient" });
            Console.WriteLine("Greeting: " + reply.Message);
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();

        }

Код сервера является шаблонным шаблоном для gRP C, но выглядит так:

namespace grpcGreeter
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        // Additional configuration is required to successfully run gRPC on macOS.
        // For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}


namespace grpcGreeter
{
    public class GreeterService : Greeter.GreeterBase
    {
        private readonly ILogger<GreeterService> _logger;
        public GreeterService(ILogger<GreeterService> logger)
        {
            _logger = logger;
        }

        public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
        {
            return Task.FromResult(new HelloReply
            {
                Message = "Hello " + request.Name
            });
        }
    }
}

Это работает. Но, поскольку я постоянно вижу смешанную информацию о том, что этого не произойдет, я не уверен, что однажды я go разверну клиентский код (т.е. обратный прокси-сервер), если у меня возникнут проблемы. Я хотел бы использовать хост типа Azure ... но не знаю, возможно ли это или нет.

Любая ясность по этому вопросу будет принята с благодарностью.

1 Ответ

1 голос
/ 18 марта 2020

Насколько я знаю, мы могли бы использовать asp. net core mvc или страницу приложения бритвы в качестве клиента для вызова сервера grp c.

Но gRP C клиент требует, чтобы у службы был доверенный сертификат, когда вы размещали приложение на удаленном сервере IIS.

Если у вас нет разрешения на установку сертификата, следует использовать HttpClientHandler.ServerCertificateCustomValidationCallback, чтобы разрешать вызовы без доверенного сертификат.

Примечание: это сделает вызов не безопасным.

Требуется дополнительная настройка для вызова небезопасных служб gRP C с клиентом. NET Core. Клиент gRP C должен установить Систему. Net .Http.SocketsHttpHandler.Http2UnencryptedSupport установить значение true и использовать http в адресе сервера.

Код, указанный ниже:

    AppContext.SetSwitch(
"System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
        var httpClientHandler = new HttpClientHandler();
        // Return `true` to allow certificates that are untrusted/invalid
        httpClientHandler.ServerCertificateCustomValidationCallback =
            HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
        var httpClient = new HttpClient(httpClientHandler);
        var channel = GrpcChannel.ForAddress("https://localhost:5001",
   new GrpcChannelOptions { HttpClient = httpClient });
        var client = new Greeter.GreeterClient(channel);
        var response = await client.SayHelloAsync(new HelloRequest { Name = "World" });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...