You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将.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加密,哪怕测试环境也需遵循
    1. 在IIS管理器的「服务器证书」中创建自签名证书
    2. 给站点添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:37:50