IIS部署ASP.Net Core应用Kestrel无法绑定指定静态端口问题咨询
配置失效核心原因
- 代码中
ConfigureKestrel配置完监听规则后,又调用了无参的UseKestrel(),该操作会重置Kestrel的所有配置,直接清除了前面设置的固定端口监听规则。 - 系统环境变量设置完成后没有重启IIS服务(或服务器),IIS工作进程继承的是修改前的环境变量,配置未生效。
- 部分低版本ASP.NET Core中,
UseIISIntegration()内部会强制覆盖PreferHostingUrls为true,即使后续调用PreferHostingUrls(false)也不生效,建议升级到3.1及以上稳定版本。
问题1:设置PreferHostingUrls为false并绑定固定端口
修正后配置代码
int port = 6500; var host = Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { // 注意:去掉无参UseKestrel()调用,避免覆盖配置 var b = webBuilder.UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() // 所有端口、PreferHostingUrls配置必须放在UseIISIntegration之后 .PreferHostingUrls(false) .ConfigureKestrel((context, options) => { // 处理最大50MB的请求 options.Limits.MaxRequestBodySize = 52428800; options.Listen(IPAddress.Any, port); }) .UseUrls($"http://localhost:{port}") .UseStartup<Startup>() .CaptureStartupErrors(true) .ConfigureLogging((hostingContext, logging) => { logging.AddNLog(hostingContext.Configuration.GetSection("Logging")); }); if (port > 0) { ComputeChildren.ParentPort = port; } }).Build();
额外配置
- 环境变量设置完成后,执行
iisreset命令重启IIS服务,确保环境变量生效。 - 无需修改IIS站点的绑定端口,IIS会作为反向代理将请求转发到Kestrel监听的6500端口。
问题2:获取Kestrel实际绑定的动态端口
可以在Host启动完成后,通过IServerAddressesFeature获取实际监听的地址,解析出端口即可给子进程使用:
// 必须在host.Run()之前、Build()之后调用 host.Start(); var serverAddressesFeature = host.ServerFeatures.Get<Microsoft.AspNetCore.Hosting.Server.Features.IServerAddressesFeature>(); var listenAddress = serverAddressesFeature.Addresses.FirstOrDefault(); if (Uri.TryCreate(listenAddress, UriKind.Absolute, out var uri)) { int actualPort = uri.Port; // 此处将actualPort传递给子进程即可 } host.WaitForShutdown();
内容的提问来源于stack exchange,提问作者andyopayne
相关产品推荐
相关产品推荐

