部署 ASP.NET Core 应用
跨平台 .NET 应用打包为自包含可执行,部署到 Kestrel+Nginx、IIS 或 Azure App Service。
平台高级
为什么
ASP.NET Core 在 .NET 8+ 跨平台且性能优秀(TechEmpower 基准)。自包含发布含运行时,服务器无需装 .NET。Kestrel 是内置高性能 Web 服务器。
何时使用
企业 C# 后端、Windows 迁 Linux 和高性能 API 用 ASP.NET Core。容器部署选自包含。
如何做
1. 发布 — dotnet publish -c Release -r linux-x64 --self-contained
2. 运行 — ./MyApp,Kestrel 默认端口 5000
3. Docker — mcr.microsoft.com/dotnet/aspnet:8.0 运行时镜像
4. IIS — dotnet publish 配 web.config,用 ASP.NET Core Module 部署 IIS
5. Azure — az webapp up,或从 GitHub Actions 部署
6. Nginx — 反向代理 Kestrel 做 TLS 和静态
7. 健康 — MapHealthChecks("/health") 供 k8s 探针
示例
// Program.cs — 最小 API 含健康检查
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHealthChecks();
var app = builder.Build();
app.MapHealthChecks("/health");
app.MapGet("/api", () => new { message = "hello" });
app.Run();
# Dockerfile — 多阶段
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /app
COPY *.csproj .
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /app/out .
EXPOSE 8080
ENTRYPOINT ["dotnet", "MyApp.dll"]
# appsettings.Production.json
{
"ConnectionStrings": { "Default": "Host=db;Database=myapp;Username=postgres" },
"Logging": { "LogLevel": { "Default": "Warning" } }
}
常见问题
- ⚠服务器缺运行时 — 框架依赖部署未装 .NET,用 --self-contained
- ⚠IIS 502.5 — ASP.NET Core Module 未装或 web.config processPath 错误
- ⚠Kestrel 端口冲突 — 默认 5000 被占,设 ASPNETCORE_URLS=http://+:8080
最佳实践
- ✓容器部署用 --self-contained — 主机无运行时依赖,完全可移植镜像
- ✓生产启用响应压缩和静态文件缓存 — 显著性能提升
- ✓设置健康检查和优雅关闭 — 处理 SIGTERM 以在退出前排空进行中的请求