如何将.NET 6 gRPC应用通过Kestrel部署至Windows Server 2019的IIS?
.NET 6 gRPC 部署至 Windows Server 2019 IIS 故障排查与解决方案
核心问题根源
部署到IIS时,手动硬编码Kestrel监听端口会和IIS的反向代理逻辑冲突,而且gRPC在IIS环境下对HTTP/2的配置有特殊要求,明文HTTP/2在IIS中支持受限,这是导致握手失败、连接被拒绝的主要原因。
一、调整服务端代码
删掉硬编码的Kestrel端口配置,交由IIS通过ASP.NET Core Module管理端口:
修改后的服务端代码示例:
var builder = WebApplication.CreateBuilder(args); // 注册gRPC服务 builder.Services.AddGrpc(); // 移除以下硬编码配置: // builder.Services.Configure<KestrelServerOptions>(opt => ...) // builder.WebHost.UseKestrel(); var app = builder.Build(); // 映射gRPC服务端点 app.MapGrpcService<GreeterService>(); app.MapGet("/", () => "gRPC端点需通过gRPC客户端访问,客户端创建教程:https://go.microsoft.com/fwlink/?linkid=2086909"); app.Run();
二、IIS关键配置
- 强制使用HTTPS绑定:gRPC over HTTP/2在IIS中要求SSL加密,哪怕测试环境也需遵循
- 在IIS管理器的「服务器证书」中创建自签名证书
- 给站点添加HTTPS绑定,选择刚创建的证书,勾选「HTTP/2」选项
- 应用程序池设置:将站点对应的应用程序池托管模式设为无托管代码
- 修改web.config:发布后自动生成的web.config需添加HTTP/2支持,调整
aspNetCore节点:
<aspNetCore processPath="dotnet" arguments=".\YourGrpcApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess"> <environmentVariables> <environmentVariable name="ASPNETCORE_HTTPS_PORTS" value="443" /> <environmentVariable name="ASPNETCORE_HTTP2_PLAINTEXT_ENABLED" value="false" /> </environmentVariables> </aspNetCore>
若非要用明文HTTP(仅测试用,生产绝对不推荐),则设置ASPNETCORE_HTTP_PORTS为你的HTTP端口,ASPNETCORE_HTTP2_PLAINTEXT_ENABLED设为true,同时给IIS站点绑定HTTP协议并勾选HTTP/2。
三、客户端适配调整
- 若用HTTPS绑定,客户端地址改为HTTPS协议,自签名证书需临时禁用验证(仅测试环境):
try { Console.WriteLine("Hello, World!"); var httpHandler = new HttpClientHandler(); // 仅测试环境使用,生产需配置信任的证书 httpHandler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator; using var channel = GrpcChannel.ForAddress("https://localhost:443", new GrpcChannelOptions { HttpHandler = httpHandler }); var client = new Greeter.GreeterClient(channel); var reply = await client.SayHelloAsync(new HelloRequest { Name = "Mauricio" }); Console.WriteLine($"Greeting {reply.Message}"); Console.ReadKey(); } catch(Exception ex) { Console.WriteLine(ex.ToString()); }
- 若用明文HTTP,客户端地址改为IIS绑定的HTTP端口即可。
四、防火墙与端口检查
- 检查Windows防火墙是否放行IIS绑定的端口(如443、自定义HTTPS/HTTP端口)
- 用
netstat -ano命令排查5001端口是否被其他进程占用,或确认IIS是否绑定了该端口
内容的提问来源于stack exchange,提问作者rulitos2406
相关产品推荐
相关产品推荐

