Я прочитал много противоречивой информации об этом, и кажется, что люди не на 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 ... но не знаю, возможно ли это или нет.
Любая ясность по этому вопросу будет принята с благодарностью.