如何在IIS托管的ASP.NET(NET6)Program.cs中获取站点端口
获取IIS托管的.NET6 ASP.NET应用运行端口的方法
针对IIS托管的.NET6 ASP.NET应用,在Program.cs中获取运行端口有两种常用方案,根据你的需求选择:
方案一:获取当前请求的外部访问端口(推荐)
如果需要获取用户实际访问的端口(比如http://test.com:7535中的7535),可以通过IHttpContextAccessor读取当前请求的Host信息,这是最准确的方式——毕竟IIS可能绑定多个端口,不同请求可能来自不同端口。
实现步骤:
- 注册
IHttpContextAccessor服务 - 在中间件或业务逻辑中注入并获取端口
var builder = WebApplication.CreateBuilder(args); // 注册HttpContext访问服务 builder.Services.AddHttpContextAccessor(); var app = builder.Build(); // 示例:在中间件中获取端口并打印 app.Use(async (context, next) => { var port = context.Request.Host.Port; if (port.HasValue) { app.Logger.LogInformation("当前请求的访问端口:{Port}", port.Value); // 这里可以将端口存入变量或用于业务逻辑 } else { // 若端口为null,说明使用的是默认端口(80/http或443/https) var defaultPort = context.Request.IsHttps ? 443 : 80; app.Logger.LogInformation("当前请求使用默认端口:{Port}", defaultPort); } await next(); }); app.MapGet("/", () => "Hello World!"); app.Run();
方案二:启动时获取应用绑定的内部端口
如果需要在应用启动阶段就获取绑定的端口(注:IIS托管下这里获取的是应用内部的监听端口,而非外部用户访问的端口),可以通过IServerAddressesFeature实现:
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); // 获取服务器地址特性,读取绑定的端口 var serverAddressesFeature = app.Services.GetRequiredService<IServerAddressesFeature>(); foreach (var address in serverAddressesFeature.Addresses) { var uri = new Uri(address); if (uri.Port > 0) { app.Logger.LogInformation("应用内部绑定的端口:{Port}", uri.Port); } } app.MapGet("/", () => "Hello World!"); app.Run();
注意事项:
- IIS托管模式下,应用内部绑定的端口通常是IIS分配的随机端口(比如
localhost:5000),和外部用户访问的端口(比如7535)不一致,所以如果需要外部访问端口,优先用方案一。
内容的提问来源于stack exchange,提问作者nicetomitja
相关产品推荐
相关产品推荐

