首页 > 解决方案 > 你能在 IIS 中运行 asp.net core 3.0 gRPC CLIENT 吗?(可能在 Azure 上?)

问题描述

我已经阅读了很多关于此的相互矛盾的信息,似乎人们并不是 100% 清楚什么是可能的,什么是不可能的。我确信由于 HTTP/2 的限制,您无法在 IIS 中托管 gRPC 服务器应用程序。文档很清楚。但是,我想使用 IIS 作为反向代理,内部使用 gRPC 进行通信。所以客户端将在 IIS 中,而不是在服务器中。我假设由于此时的通信(即后端)不是通过 IIS 进行的,因此不会有任何问题。但是,我一直看到混合的答案。

我创建了一个托管在 IIS Express 中的哑 web 应用程序,并且可以使用 gRPC 成功发布到我在 Kestrel 上运行的服务。

下面的客户端代码示例。SubmitButton 只是 razor 页面上的一个表单帖子。

        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();

        }

服务器代码是 gRPC 的样板模板,但看起来像这样:

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
            });
        }
    }
}

这行得通。但是,因为我不断看到混合信息说它不会,所以我不确定一旦我去部署客户端代码(即反向代理),我是否会遇到问题。我想使用像 Azure 这样的主机......但不知道是否可能。

任何关于该主题的明确性将不胜感激。

标签: asp.netazureiisgrpcasp.net-core-3.0

解决方案


据我所知,我们可以使用 asp.net core mvc 或 razor page 应用程序作为客户端来调用 grpc 服务器。

但是当您在远程服务器 IIS 上托管应用程序时,gRPC 客户端要求服务具有受信任的证书。

如果您没有安装证书的权限,则应使用 HttpClientHandler.ServerCertificateCustomValidationCallback 允许没有受信任证书的调用。

注意:这将使呼叫不安全。

使用 .NET Core 客户端调用不安全的 gRPC 服务需要额外的配置。gRPC 客户端必须将 System.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" });

推荐阅读