如何调整Kestrel的端口

ASP.NET Core 中调整 Kestrel 服务器的端口可以通过多种方式实现。以下是详细的配置方法:


1. 通过 appsettings.json 配置文件

这是最推荐的方式,支持不同环境(Development/Production)的差异化配置。

json 复制代码
{
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://localhost:5000"  // 默认HTTP端口
      },
      "Https": {
        "Url": "https://localhost:5001" // 默认HTTPS端口
      }
    }
  }
}

修改示例(将 HTTP 改为 8080,HTTPS 改为 8443):

json 复制代码
{
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://localhost:8080"
      },
      "Https": {
        "Url": "https://localhost:8443"
      }
    }
  }
}

2. 通过代码直接配置(Program.cs)

WebApplicationBuilder 构建阶段直接指定端口:

csharp 复制代码
var builder = WebApplication.CreateBuilder(args);

// 配置Kestrel端口
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.ListenAnyIP(8080);    // 监听所有IP的8080端口(HTTP)
    serverOptions.ListenAnyIP(8443, listenOptions => 
    {
        listenOptions.UseHttps("certificate.pfx", "password"); // HTTPS配置
    });
});

var app = builder.Build();
app.Run();

3. 使用命令行参数

启动应用时通过命令行参数指定:

bash 复制代码
dotnet run --urls "http://localhost:8080;https://localhost:8443"

4. 环境变量配置

通过操作系统环境变量配置(适合容器化部署):

bash 复制代码
# Linux/macOS
export ASPNETCORE_URLS="http://localhost:8080;https://localhost:8443"

# Windows
set ASPNETCORE_URLS=http://localhost:8080;https://localhost:8443

5. 多端口监听配置

允许同时监听多个端口:

csharp 复制代码
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.ListenAnyIP(8080);    // HTTP
    serverOptions.ListenAnyIP(8081);    // 第二个HTTP端口
    serverOptions.ListenAnyIP(8443, opts => opts.UseHttps()); // HTTPS
});

6. 动态端口绑定(随机端口)

让系统自动分配可用端口:

csharp 复制代码
builder.WebHost.UseUrls("http://*:0"); // 随机HTTP端口

通过代码获取实际分配的端口:

csharp 复制代码
var app = builder.Build();
app.Run();

// 获取实际端口(需在Run之后获取)
var port = app.Services.GetService<IServer>()
    .Features.Get<IServerAddressesFeature>()
    .Addresses.First().Split(':').Last();

7. 不同环境的差异化配置

appsettings.Development.jsonappsettings.Production.json 中分别定义:

开发环境(appsettings.Development.json)

json 复制代码
{
  "Kestrel": {
    "Endpoints": {
      "Http": { "Url": "http://localhost:5000" }
    }
  }
}

生产环境(appsettings.Production.json)

json 复制代码
{
  "Kestrel": {
    "Endpoints": {
      "Http": { "Url": "http://*:80" },
      "Https": { "Url": "https://*:443" }
    }
  }
}

验证配置是否生效

启动应用时观察控制台输出:

csharp 复制代码
Now listening on: http://localhost:8080
Now listening on: https://localhost:8443

总结

场景 推荐方式
开发环境快速修改 命令行参数或 launchSettings.json
生产环境固定端口 appsettings.json + 代码配置
容器化部署 环境变量配置
需要动态端口 代码绑定端口 0 + 获取实际端口

选择最适合你场景的方式,通常推荐使用 appsettings.json 进行集中化管理。

相关推荐
n8n1 分钟前
Java 21 虚拟线程(Virtual Threads)
后端
Csvn20 分钟前
🐍 Day 5: Python 函数详解 — 参数、作用域与一等公民
人工智能·后端
wno70426 分钟前
Spring Boot中使用Servlet
spring boot·后端·servlet
老郑聊AI业财智造34 分钟前
Spring AI 技术架构与源码分析
java·人工智能·后端·spring·架构·软件工程
省长39 分钟前
别人绕过我的网关直接调用资源服务怎么办?使用 Sa-Token 解决:网关转发鉴权、RPC调用鉴权
java·后端·开源
MetaLite41 分钟前
SpringBoot异常处理-到底该转换还是继续抛-入口层与调用层不能一刀切
java·spring boot·后端
Liora_Yvonne1 小时前
不懂后端,只会 TypeScript,想独立做完整项目?这套全栈底座就是给前端准备的
前端·后端·全栈
前端Hardy1 小时前
GitHub 爆火!236K+ Star!一套 Skills 让 AI 按工程师方式写代码
前端·后端
名字还没想好☜1 小时前
Go 用 slices/maps 标准库泛型函数:告别手写 Contains、Sort、去重(Go 1.21)
开发语言·后端·算法·golang·go
程序大爆炸2 小时前
gcsfuse与中断FUSE_INTERRUPT
后端