1. 环境准备:IIS与.NET Core运行时安装
第一次在Windows Server上部署ASP.NET Core应用时,我花了整整两天时间才搞明白环境依赖关系。IIS在这里其实扮演的是反向代理角色,真正运行.NET Core应用的是Kestrel服务器。下面分享我总结的高效配置方法:
安装IIS核心组件: 在Windows搜索栏输入"启用或关闭Windows功能",勾选以下关键项:
- Internet Information Services → Web管理工具 → IIS管理控制台
- Internet Information Services → 万维网服务 → 应用开发功能 → ASP.NET 4.8(向后兼容)
- Internet Information Services → 万维网服务 → 常见HTTP功能 → 静态内容、默认文档
注意:如果跳过ASP.NET 4.8安装,后续可能遇到HTTP错误500.19。这是我在生产环境踩过的坑,因为某些IIS模块仍依赖传统ASP.NET。
安装.NET Core运行时: 访问微软官方下载页面获取最新版:
# 下载地址(示例): https://dotnet.microsoft.com/download/dotnet-core必须安装:
- ASP.NET Core Runtime(运行环境)
- .NET Core Runtime(基础库)
- Hosting Bundle(IIS集成模块)
安装完成后验证:
dotnet --list-runtimes # 应显示类似输出: # Microsoft.AspNetCore.App 6.0.8 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App] # Microsoft.NETCore.App 6.0.8 [/usr/share/dotnet/shared/Microsoft.NETCore.App]2. 应用发布与部署配置
发布ASP.NET Core应用时,我强烈推荐使用框架依赖的便携式发布方式。这样既能保持部署包精简,又能利用服务器上的共享运行时。
发布命令示例:
dotnet publish -c Release -f net6.0 --self-contained false -o ./publish关键文件结构说明:
/publish │ web.config # IIS配置文件 │ YourApp.dll # 主程序集 ├── wwwroot/ # 静态资源 ├── Views/ # 视图文件 └── appsettings.json # 配置文件IIS站点配置技巧:
在IIS管理器中右键"应用程序池" → 新建 → 命名如"MyAppPool"
将.NET CLR版本设为"无托管代码"(必须!)
高级设置中:
- 启用32位应用程序 → False(除非有特殊需求)
- 进程模型 → 标识 → ApplicationPoolIdentity(推荐)
右键"网站" → 添加网站 → 设置:
- 物理路径:指向publish文件夹
- 绑定:建议使用特定端口如5000,避免与默认站点冲突
- 主机名:生产环境填写实际域名
3. 安全加固与网络配置
防火墙设置:
# 允许入站流量(管理员权限运行): New-NetFirewallRule -DisplayName "Allow MyApp Port" -Direction Inbound -LocalPort 5000 -Protocol TCP -Action Allow环境变量管理: 通过web.config配置开发/生产环境:
<aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="true"> <environmentVariables> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" /> <environmentVariable name="DOTNET_PRINT_TELEMETRY_MESSAGE" value="false" /> </environmentVariables> </aspNetCore>权限问题排查清单:
- 应用程序池账户对publish文件夹的读取/执行权限
- 对logs文件夹的写入权限(如果启用stdout日志)
- 对临时目录(%TEMP%)的写入权限
4. 深度故障排查指南
当遇到HTTP 502.5错误时,按以下步骤排查:
检查事件查看器:
- Windows日志 → 系统:查找来源为"IIS AspNetCore Module"的条目
- 应用程序和服务日志 → Microsoft → IIS → AspNetCore Module
启用详细日志:
<aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout">日志文件将记录Kestrel启动过程中的详细错误。
常见错误解决方案:
- 错误ANCM:重新安装Hosting Bundle
- 端口冲突:检查是否有其他进程占用相同端口
netstat -ano | findstr :5000- 依赖缺失:在服务器执行
dotnet YourApp.dll直接运行测试
性能调优参数:
<aspNetCore processPath="dotnet" arguments=".\YourApp.dll" startupTimeLimit="120" <!-- 启动超时延长 --> rapidFailsPerMinute="5" <!-- 每分钟最大崩溃次数 --> requestTimeout="00:10:00"> </aspNetCore>5. 高级部署策略
蓝绿部署实践:
- 准备两个完全相同的站点(如MyApp_Blue和MyApp_Green)
- 使用ARR(应用请求路由)设置流量切换规则
- 通过PowerShell脚本实现零停机更新:
# 禁用旧站点 Stop-WebSite -Name "MyApp_Blue" # 同步文件到新部署目录 Robocopy .\publish \\server\MyApp_Green /MIR # 启用新站点 Start-WebSite -Name "MyApp_Green"健康检查配置: 在Startup.cs中添加:
app.UseHealthChecks("/health", new HealthCheckOptions { Predicate = _ => true, ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse });然后在IIS中设置URL重写规则,将/health请求直接代理到Kestrel,绕过缓存等中间件。
6. 性能监控与优化
启用动态压缩:
# 安装压缩模块 Install-WindowsFeature Web-Dyn-Compression # 配置压缩规则 Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/httpCompression" -name "." -value @{dynamicTypes='text/plain,text/html,application/json'}工作进程优化:
# 设置应用程序池回收策略 Set-ItemProperty IIS:\AppPools\MyAppPool -Name Recycling.periodicRestart.time -Value "00:00:00" Set-ItemProperty IIS:\AppPools\MyAppPool -Name processModel.idleTimeout -Value "00:00:00"内存限制调整:
<system.applicationHost> <applicationPools> <add name="MyAppPool" autoStart="true" managedRuntimeVersion="" startMode="AlwaysRunning"> <recycling logEventOnRecycle="Time, Requests, ConfigChange"> <periodicRestart requests="10000" /> </recycling> <processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="true" idleTimeout="00:00:00" maxProcesses="1" shutdownTimeLimit="90" /> </add> </applicationPools> </system.applicationHost>在实际项目中,我发现合理配置这些参数可以将ASP.NET Core应用在IIS上的吞吐量提升3-5倍。特别是在高并发场景下,关闭空闲超时和设置预热启动能显著降低第一个请求的延迟。