← 博客
技术2026-08-305 次阅读

Windows Server IIS 部署实战:.NET 应用绑定、端口占用与错误页排查

# Windows Server# IIS# .NET 8# 部署运维,错误排查

背景:为什么新部署的 .NET 应用总被"403.14 - Forbidden"拦截

刚部署到 Windows Server 2022 的 MES 子系统,控制台跑得好好的,一发布到 IIS 就报错:403.14 - Forbidden,浏览器看到的是一串静态 HTML,没有任何异常信息。更诡异的是,同一台服务器上的其他 .NET 站点都能正常访问。

这是很多初次接触 IIS 的人会踩的坑。MES 系统往往要部署在内网多服务器上,配置稍有差池就会导致服务不可用,产线主管问"为什么又挂了"的时候,你已经满头大汗了。

解决思路:403.14 的真实含义

IIS 的 403.14 错误不是服务器坏了,而是告诉你:这个目录默认文档为空,且未启用目录浏览。也就是说,访问 http://localhost/mes-app 时,IIS 不知道要返回哪个文件——没有 index.html、default.aspx,也不允许你看到目录列表。

对于 .NET Core/5+/8 应用,正确姿势不是配置默认文档,而是使用反代或绑定 Kestrel 的 URL。本文按步骤记录完整部署流程,附三个真实踩坑案例。

第一步:本地发布前准备

在开发机上,先确认发布配置正确:

{
  "publishProfiles": {
    "FolderPublish": {
      "publishMethod": "FileSystem",
      "publishUrl": "D:\\publish\\mes-app",
      "FileSystemProfile": {
        "allowOutdatedProjects": true
      }
    }
  }
}

发布命令:

dotnet publish -c Release -o D:\publish\mes-app

发布后检查输出:必须包含 appsettings.Production.json,否则到了服务器还是用开发环境的配置(比如开发环境的数据库连接串)。

第二步:IIS 安装与角色配置

Windows Server 默认不装 IIS,要手动添加角色:

ServerManagerCmd.exe -install Web-Server,Web-ASPNET45,Web-Windows-Authentication

或者在图形界面:服务器管理器 → 添加角色和功能 → Web 服务器 → ASP.NET 4.5 → Windows 身份验证。

踩坑一:没有装 ASP.NET 注册。有些服务器装了 IIS 但没注册 ASP.NET 模块,导致应用程序池启动时找不到 .NET 处理程序。解决办法是运行:

regasm.exe "%windir%\Microsoft.NET\Framework64\v4.0.30319\ASP.NET.dll"

第三步:配置应用程序池

打开 IIS 管理器,创建新的应用程序池 MESAppPool:

  • .NET CLR 版本:选择"No Managed Code"(.NET Core/5+ 不需要);
  • 托管管道模式:选择"Integrated";
  • 启动模式:选择"AlwaysOn"(保持站点常驻内存,避免冷启动慢)。

设置应用程序池的回收策略:时间间隔 1740 分钟(29 小时)+ 内存限制 1800MB,避免内存泄漏导致服务假死。

第四步:创建网站并绑定

1. 添加站点:MES-App,物理路径指向发布目录 D:\webapps\mes-app。

2. 绑定配置——这是关键步骤:

站点名称:MES-App
IP 地址:*
端口:5000
主机名:mes-prod.local(可选)

踩坑二:端口冲突。80 端口可能被其他服务占用(如 Skype、其他站点)。先用以下命令查端口占用:

netstat -ano | findstr :5000

如果显示 LISTENING,用 taskkill /PID /F 杀掉进程,或者改端口。

3. 绑定默认文档。对于 .NET Core 应用,不需要默认文档——而是需要配置反向代理到 Kestrel:

网站 → 处理程序映射 → 添加模块映射
请求路径:*
模块:IIS HttpPlatformHandler
可执行文件:D:\webapps\mes-app\mes-app.exe
参数:""

第五步:配置反向代理

.NET Core 应用默认运行在 Kestrel 上(端口随机),IIS 作为反向代理转发请求。发布时配置 web.config:

<system.webServer>
  <handlers>
    <add name="HttpPlatformHandler" path="*" verb="*" modules="HttpPlatformHandler" resourceType="Unspecified" />
  </handlers>
  <httpPlatform processPath="mes-app.exe" arguments="" stdoutLogPath="D:\webapps\mes-app\logs" />
</system.webServer>

stdoutLogPath 是日志目录,用来记录应用启动日志和异常,必须存在且有写入权限。

第六步:文件与身份权限配置

发布目录需要给应用程序池的账号读写权限:

应用程序池身份:IIS AppPool\MESAppPool
权限:读取 + 写入(日志目录、临时缓存目录)

如果是 Windows 身份验证,还要配置 web.config:

<system.web>
  <authentication mode="Windows" />
</system.web>
<authentication mode="Windows" />

踩坑记录:三个真实案例

  • 403.14 不是默认文档问题:一开始以为要配置 default.aspx,后来发现 .NET Core 应用不需要——需要的是 HttpPlatformHandler 和 web.config 的反向代理配置。
  • 500.19 错误:配置节未注册:IIS 找不到 system.webServer/httpPlatform 节,根因是没装 HttpPlatformHandler 模块。从官网下载并安装后解决。
  • 端口 443 被占,HTTPS 配不上:IIS 的默认网站占用了 443,导致新站点无法配置 SSL。解决方法:改新站点端口为 5443,或删/停默认网站(不推荐在生产环境这么做)。

验证步骤

  1. 本地访问:服务器本机用浏览器访问 http://localhost:5000,应该能看到应用首页。
  2. 检查日志:打开 D:\webapps\mes-app\logs\stdout.log,看启动日志是否正常,有没有数据库连接失败。
  3. 外网测试:用另一台机器访问 http://10.35.151.1:5000,确认网络可达。
  4. IIS 日志检查:如果还是失败,看 D:\inetpub\logs\LogFiles\W3SVC1,403/404/500 都能定位原因。

总结

Windows Server 部署 .NET 应用的核心要点:反向代理配置、端口绑定、权限设置、日志目录。

  • 发布前:确认 appsettings.Production.json 存在,数据库连接串正确;
  • IIS 配置:装 HttpPlatformHandler,设应用程序池为"No Managed Code";
  • 绑定:端口不被占用,SSL 证书正确配置;
  • 权限:应用程序池账号对发布目录有读写权限;
  • 调试:看 stdout.log 和 IIS 日志,别只看浏览器错误页。

附:部署检查清单

  • IIS 已安装 + ASP.NET 注册 + HttpPlatformHandler?
  • 应用程序池配置正确(No Managed Code)?
  • 端口未被占用?
  • 发布目录有写入权限?
  • 日志目录存在且有权限?
  • web.config 配置完整?
  • 数据库连接串正确?

按这个清单过一遍,IIS 部署问题能解决 90%。剩下的 10% 通常是数据库权限或防火墙问题——那些又是另一个故事了。

评论 (0)