【发布时间】: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