1. 环境准备与IIS安装
第一次在Windows Server 2016上部署ASP.NET Core WebApi时,我踩了不少坑。记得当时为了赶项目进度,直接从零开始配置服务器,结果因为漏装了几个关键组件,折腾到凌晨三点。现在把这些经验整理成详细的步骤,帮你省去这些麻烦。
首先确保你的服务器是全新安装的Windows Server 2016数据中心版64位中文版。我建议先做个系统快照,这样配置出错时可以快速回滚。打开服务器管理器,在仪表盘中选择"添加角色和功能",这个入口有点隐蔽,很多新手会找不到。
安装IIS时最容易漏掉的是ASP.NET组件。除了默认选中的"Web服务器(IIS)",一定要展开"应用程序开发"选项,勾选:
- ASP.NET 4.6(兼容旧版应用)
- .NET Extensibility 4.6
- ISAPI扩展
- ISAPI过滤器
这些组件看起来和Core版无关,但实际上IIS的集成管道模式需要它们。我有次部署时没装,结果遇到500.19错误,排查了半天才发现问题。
安装完成后别急着关闭窗口,先验证IIS是否正常运行。打开浏览器访问http://localhost,看到IIS欢迎页面才算成功。如果遇到访问被拒绝,可能是防火墙挡住了80端口,需要手动放行。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. .NET运行时环境配置
ASP.NET Core应用需要对应的运行时支持,这里有个常见误区:很多人以为安装了Visual Studio就自带运行时,其实服务器上必须单独安装。我推荐使用.NET 6.0 LTS版本,既稳定又支持长期更新。
下载运行时安装包时要注意版本匹配。曾经有个项目组用了x86架构的运行时,结果在64位系统上各种诡异崩溃。建议直接下载x64版本,运行以下命令验证安装:
bash复制dotnet --list-runtimes
正常应该显示类似这样的输出:
code复制Microsoft.AspNetCore.App 6.0.21 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 6.0.21 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
如果遇到命令不可用的情况,可能是环境变量没配置。手动检查Path变量是否包含C:\Program Files\dotnet。我遇到最坑的情况是安装程序静默失败,这时候需要先用官方卸载工具清理残留,再重新安装。
3. 应用发布与目录配置
发布WebApi应用时,我强烈建议使用独立部署模式。虽然会增加包体积,但能避免服务器环境差异导致的问题。在Visual Studio中右键项目选择"发布",然后配置发布选项:
- 部署模式:独立
- 目标运行时:win-x64
- 目标框架:net6.0
- 单个文件:不勾选(方便调试)
发布完成后,在服务器C盘创建wwwroot目录作为应用根目录。这里有个安全细节:右键目录→安全→编辑,添加IIS_IUSRS组的读写权限。我见过太多因为权限问题导致应用无法启动的案例。
解压发布包时注意保持目录结构完整。特别是appsettings.json和web.config这两个文件,它们必须位于应用根目录。有次我移动文件时不小心改动了层级,结果应用直接500错误。
4. IIS站点配置详解
打开IIS管理器,右键"网站"选择"添加网站"。配置时这几个参数最关键:
- 网站名称:建议用英文(比如WebApiProd)
- 物理路径:指向刚才创建的wwwroot目录
- 绑定类型:http/https
- IP地址:全部未分配
- 端口:非80端口记得防火墙放行
- 主机名:如果是内网部署可以留空
点击确定前,务必右键应用程序池,把.NET CLR版本改为"无托管代码"。这是ASP.NET Core的特殊要求,选错会导致502.5错误。我建议同时设置"启动模式"为AlwaysRunning,这样服务重启后能自动恢复。
测试站点时如果遇到HTTP Error 502.5,大概率是ANCM(ASP.NET Core Module)没配置好。检查web.config中的aspNetCore节点:
xml复制<aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" />
开启stdout日志能快速定位问题,记得先在wwwroot下创建logs目录。
5. 安全加固与性能调优
基础部署完成后,我通常会做这些安全加固:
- 在IIS中删除默认站点
- 关闭目录浏览功能
- 配置请求过滤,阻止可疑扩展名
- 设置自定义错误页面,避免泄露系统信息
性能方面,这几个参数调整效果显著:
- 应用程序池→高级设置:
- 回收→固定时间间隔改为1440分钟
- 进程模型→闲置超时改为0
- 快速故障防护→启用改为false
对于高并发场景,建议在web.config中添加这些参数:
xml复制<aspNetCore requestTimeout="00:20:00" shutdownTimeLimit="60" startupTimeLimit="360" />
6. 常见问题排查指南
部署过程中最常遇到的三个问题:
问题1:应用启动后立即退出
检查事件查看器→Windows日志→Application,通常能看到详细错误。我遇到最多的是端口冲突,修改appsettings.json中的Urls配置即可。
问题2:静态文件返回404
确保已安装StaticFiles中间件,并且在Startup.cs中正确配置:
csharp复制app.UseStaticFiles();
同时检查文件是否有读取权限。
问题3:跨域请求失败
需要在ConfigureServices中添加:
csharp复制services.AddCors(options =>
{
options.AddPolicy("AllowAll", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
});
然后在Configure中启用:
csharp复制app.UseCors("AllowAll");
最后提醒一点:内网环境部署时,记得关闭IE增强安全配置。虽然这步看起来和部署无关,但后续管理操作会方便很多。在服务器管理器→本地服务器→IE增强安全配置,两个选项都设为"关闭"即可。
