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 BundleIIS集成模块安装完成后验证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 processPathdotnet arguments.\YourApp.dll stdoutLogEnabledtrue environmentVariables environmentVariable nameASPNETCORE_ENVIRONMENT valueProduction / environmentVariable nameDOTNET_PRINT_TELEMETRY_MESSAGE valuefalse / /environmentVariables /aspNetCore权限问题排查清单应用程序池账户对publish文件夹的读取/执行权限对logs文件夹的写入权限如果启用stdout日志对临时目录%TEMP%的写入权限4. 深度故障排查指南当遇到HTTP 502.5错误时按以下步骤排查检查事件查看器Windows日志 → 系统查找来源为IIS AspNetCore Module的条目应用程序和服务日志 → Microsoft → IIS → AspNetCore Module启用详细日志aspNetCore processPathdotnet arguments.\YourApp.dll stdoutLogEnabledtrue stdoutLogFile.\logs\stdout日志文件将记录Kestrel启动过程中的详细错误。常见错误解决方案错误ANCM重新安装Hosting Bundle端口冲突检查是否有其他进程占用相同端口netstat -ano | findstr :5000依赖缺失在服务器执行dotnet YourApp.dll直接运行测试性能调优参数aspNetCore processPathdotnet arguments.\YourApp.dll startupTimeLimit120 !-- 启动超时延长 -- rapidFailsPerMinute5 !-- 每分钟最大崩溃次数 -- requestTimeout00:10:00 /aspNetCore5. 高级部署策略蓝绿部署实践准备两个完全相同的站点如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 {dynamicTypestext/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 nameMyAppPool autoStarttrue managedRuntimeVersion startModeAlwaysRunning recycling logEventOnRecycleTime, Requests, ConfigChange periodicRestart requests10000 / /recycling processModel identityTypeApplicationPoolIdentity loadUserProfiletrue setProfileEnvironmenttrue idleTimeout00:00:00 maxProcesses1 shutdownTimeLimit90 / /add /applicationPools /system.applicationHost在实际项目中我发现合理配置这些参数可以将ASP.NET Core应用在IIS上的吞吐量提升3-5倍。特别是在高并发场景下关闭空闲超时和设置预热启动能显著降低第一个请求的延迟。