【问题标题】:Can you run a asp.net core 3.0 gRPC CLIENT in IIS? (possibly on Azure?)你能在 IIS 中运行 asp.net core 3.0 gRPC CLIENT 吗? (可能在 Azure 上?)
【发布时间】:2020-06-28 02:36:35
【问题描述】:

我已经阅读了很多关于此的相互矛盾的信息,似乎人们并不是 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 这样的主机...但不知道是否可能。

我们将不胜感激。

【问题讨论】:

  • 这有什么更新吗?您是否设法让 gRPC 客户端在 IIS 上运行?

标签: asp.net azure iis grpc asp.net-core-3.0


【解决方案1】:

据我所知,我们可以使用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" });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2021-12-14
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多