ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Windows Server 部署 .NET WebApi:IIS 配置与防火墙避坑指南

Windows Server 部署 .NET WebApi:IIS 配置与防火墙避坑指南

简介:这份PDF文档面向需要在Windows服务器上部署.NET WebApi的开发者与运维人员,聚焦于借助IIS完成站点发布并开放外部访问端口这一常见但易踩坑的环节。内容围绕IIS角色与功能的安装、.NET Framework 3.5与4.5组件的勾选、应用程序池与虚拟目录的配置,以及端口开放后的访问验证展开,适合具备一定ASP.NET基础、希望独立完成服务上线的初中级工程师参考。资源包内共1个PDF文件,约536KB,篇幅精炼,便于随查随用。文档以服务器管理器与IIS管理器的实际操作路径为主线,逐步说明添加角色和功能、勾选Web服务器角色、安装管理工具等关键节点,并提示了组件漏选、应用程序池版本不匹配、端口未放行等常见问题,可帮助读者减少反复试错,快速打通从本地调试到服务器对外提供RESTful接口的完整链路。目前已有341人学习下载。

1. 从一台裸机 Windows Server 开始:为什么 IIS 装完还是跑不起来

很多人第一次把 .NET WebApi 往 Windows 服务器上搬,都会经历同一个场景:服务器管理器里 IIS 装好了,站点也建了,浏览器一访问,要么 404,要么 500.19,要么直接连接超时。明明每一步都照着截图点了,问题出在哪?答案往往不在 IIS 本身,而在安装阶段漏勾的那几个 .NET Framework 组件,以及应用程序池的托管管道模式选错了版本。这套环境在中小型项目里极其常见——Windows Server + IIS + .NET WebApi,几乎是把本地调试好的接口原样搬到服务器上的标准路径。装不好,接口上不了线,前端联调全部卡住。这篇笔记适合两类人:第一次在 Windows 服务器上部署 WebApi 的新手,以及装过几次但总在端口和应用程序池上翻车的老手。下面按「装 IIS → 配站点 → 放行端口 → 验证排错」的顺序走一遍。

2. 安装 IIS 与 .NET Framework 组件:服务器管理器里的勾选逻辑

2.1 添加角色和功能的前置检查

在开始菜单旁边的服务器管理器图标点开,顶部菜单栏找到「管理」,下拉里选「添加角色和功能」。向导第一步是「开始之前」,直接下一步;第二步「安装类型」选「基于角色或功能的安装」;第三步「服务器选择」默认选当前服务器池里的本机。这三步没什么坑,但第四步「服务器角色」是整个安装过程的分水岭。

在角色列表里找到「Web 服务器(IIS)」,勾上它。此时会弹出一个确认框,提示需要添加 IIS 所需的功能,点「添加功能」。这一步如果手快点了取消,后面 IIS 管理工具不会出现,站点根本建不了。

2.2 .NET Framework 3.5 与 4.5 功能的勾选细节

继续下一步到「功能」界面。这里要展开两个节点:.NET Framework 3.5 功能和 .NET Framework 4.5 功能。注意,不是只勾父节点,要把每个可展开的下级选项框全部勾上。常见做法是逐个展开,确认「WCF 服务」「HTTP 激活」这类子项没有漏。.NET WebApi 依赖的是 4.5 这一支,但 3.5 留着是为了兼容一些老的管理模块,不勾的话 IIS 管理器里部分图标会缺失。

# 如果习惯用 PowerShell 批量确认已安装的功能状态 Get-WindowsFeature -Name NET-Framework-*,Web-Server,Web-Mgmt-Tools | Format-Table Name,InstallState

这段命令列出所有相关功能的安装状态。InstallState显示Installed才算勾选成功,显示Available说明漏了。参数-Name支持通配符,一次把 .NET Framework 和 Web 服务器相关的都查出来,比在图形界面里翻列表快。

2.3 IIS 角色服务与管理工具的取舍

进入「角色服务」界面后,默认勾选的是基础项。往下拉到最底部,把「管理工具」下的子项全部勾上,包括 IIS 管理控制台、IIS 管理脚本和工具、IIS 管理兼容性。其他角色服务项保持默认即可,不需要额外勾 FTP 或 SMTP。点下一步,确认安装,等待进度条走完。

装完后在服务器管理器左侧能看到「IIS」节点,或者在开始菜单搜索「IIS 管理器」能打开,说明安装成功。如果搜不到,多半是管理工具没勾全,回到「添加角色和功能」里补勾一次,不需要重装整个 IIS。

提示:安装过程中如果提示需要指定备用源路径,通常是因为系统缺少 .NET 3.5 的本地源文件。可以跳过 3.5 只装 4.5,WebApi 本身不依赖 3.5 运行。

3. 配置 IIS 站点与应用程序池:让 WebApi 真正被托管

3.1 创建应用程序池与 .NET 版本选择

打开 IIS 管理器,左侧展开服务器节点,右键「应用程序池」,选「添加应用程序池」。名称按项目命名,比如ApiPool。.NET CLR 版本这一项是关键:如果 WebApi 是基于 .NET Framework 4.5+ 开发的,选v4.0.30319;如果是 .NET Core 或 .NET 5+,这里选「无托管代码」,因为 Core 系列不走 CLR 托管。托管管道模式选「集成」,不要选「经典」,经典模式会导致路由模块不生效,接口全部 404。

<!-- 应用程序池的 pipeline 配置在 applicationHost.config 中体现为 --> <add name="ApiPool" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" />

managedRuntimeVersion="v4.0"对应 .NET Framework 4.x,managedPipelineMode="Integrated"表示集成模式。这两个值在图形界面里就是「.NET CLR 版本」和「托管管道模式」两个下拉框。改错任何一个,WebApi 的路由特性都无法正常解析。

3.2 添加网站与物理路径映射

右键「网站」,选「添加网站」。网站名称填项目名,物理路径指向 WebApi 发布输出目录,比如D:\publish\MyApi。这个目录里应该有bin、web.config、Global.asax等文件。绑定类型选 HTTP,IP 地址选「全部未分配」,端口填一个未被占用的值,比如8080。主机名留空,除非同一端口要绑多个域名。

添加完成后,在左侧「网站」下能看到新站点。点进去,右侧「管理网站」区域有「浏览」链接,点一下会用服务器上的浏览器打开http://localhost:8080。如果返回 WebApi 的默认页或接口列表,说明站点已托管成功。

3.3 虚拟目录与权限的常见做法

如果 WebApi 不是放在站点根目录,而是子路径,比如http://server:8080/api,就需要加虚拟目录。右键站点,选「添加虚拟目录」,别名填api,物理路径指向实际发布目录。这样外部访问/api时才会映射到对应文件夹。

权限方面,IIS 默认用IIS_IUSRS组读取物理路径。常见做法是右键发布文件夹,属性 → 安全 → 编辑 → 添加IIS_IUSRS,给「读取和执行」「列出文件夹内容」「读取」三项。如果 WebApi 需要写日志或上传文件,再加「写入」。少了读取权限,访问会报 500.19 或 401.3。

4. 开放端口与防火墙配置:外部客户端能连上的最后一公里

4.1 入站规则的新建流程

服务器本机能访问不代表外部能访问。Windows 防火墙默认拦截入站连接。打开「高级安全 Windows Defender 防火墙」,左侧选「入站规则」,右侧「新建规则」。规则类型选「端口」,协议选 TCP,特定本地端口填站点绑定的端口,比如8080。操作选「允许连接」,配置文件三个都勾上(域、专用、公用),名称填WebApi-8080。

# 用 PowerShell 新建入站规则,等价于上面的图形操作 New-NetFirewallRule -DisplayName "WebApi-8080" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow -Profile Any

-Direction Inbound表示入站,-LocalPort 8080对应站点端口,-Action Allow放行,-Profile Any让域、专用、公用三种网络环境都生效。如果服务器有多张网卡或做了 NAT,还要确认云厂商的安全组里也放行了同一端口,否则防火墙开了也没用。

4.2 端口占用的排查方法

如果站点启动时报「端口已被占用」,先用命令查谁占着。

netstat -ano | findstr :8080

输出最后一列是进程 PID。拿到 PID 后,用tasklist | findstr <PID>看是哪个进程。常见的是之前残留的 dotnet 进程或另一个 IIS 站点。解决办法要么停掉占用进程,要么给站点换端口。换端口后记得同步改防火墙规则和客户端调用地址。

4.3 外部访问验证与绑定调整

在另一台机器上打开浏览器,输入http://服务器IP:8080/接口路径。如果连不上,先在服务器本机用http://localhost:8080确认站点本身正常,再检查防火墙规则是否生效。还可以用telnet 服务器IP 8080测试端口连通性,通的话 telnet 窗口会保持连接,不通会提示连接失败。

如果服务器有多个 IP,绑定里选「全部未分配」通常最省事。若只绑了某个内网 IP,外部通过公网 IP 访问就会失败。这种情况在「网站绑定」里编辑,把 IP 改成「全部未分配」或加上公网 IP。

5. 避坑与排查:IIS 部署 WebApi 最常见的五个翻车点

5.1 500.19 错误:web.config 配置节被锁定

现象:访问接口返回 HTTP 500.19,提示「配置错误,无法读取配置节」。原因通常是 IIS 里某个配置节被锁定,比如handlers或modules。解决:打开 IIS 管理器,选中服务器节点,双击「配置编辑器」,在「节」列表里找到报错的那个节,右侧「锁定」改为「解锁」。或者用命令行:

%windir%\system32\inetsrv\appcmd unlock config /section:system.webServer/handlers

5.2 404.0 或 404.3:路由模块未加载

现象:站点能打开,但所有接口路径都返回 404。原因多半是应用程序池的托管管道模式选了「经典」,或者web.config里runAllManagedModulesForAllRequests没设。解决:把应用程序池改为「集成」模式;如果仍不行,在web.config的system.webServer下加:

<modules runAllManagedModulesForAllRequests="true" />

5.3 500.21 或 500.22:.NET Framework 版本不匹配

现象:报「处理程序映射错误」或「ASP.NET 未安装」。原因是 IIS 里注册的 ASP.NET 版本和应用程序池选的 CLR 版本不一致。解决:以管理员身份运行命令提示符,执行:

%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i

这条命令把 4.0 的 ASP.NET 重新注册到 IIS。如果服务器上同时有 2.0 和 4.0,注意选对目录。

5.4 外部无法访问但本机正常:防火墙或安全组漏配

现象:服务器上localhost能访问,外部 IP 访问超时。原因通常是 Windows 防火墙没放行端口,或者云平台安全组没开。解决:按第 4 章的步骤检查入站规则,同时登录云控制台确认安全组入方向规则里该端口是「允许」。两个地方都放行才算通。

5.5 应用程序池自动停止:标识或权限问题

现象:站点运行一段时间后自动停,事件查看器里有「应用程序池被自动禁用」的记录。原因可能是应用程序池标识没有访问发布目录的权限,或者代码里有未处理异常导致频繁崩溃。解决:把应用程序池标识改为ApplicationPoolIdentity,并确保IIS_IUSRS对发布目录有读取权限;同时检查代码日志,修复导致进程崩溃的异常。

6. 装完怎么验证:从本机到外部的三层检查法

部署完成后别急着交付,按三层顺序验证一遍,能省掉大量来回沟通。第一层,服务器本机打开浏览器访问http://localhost:端口/接口,确认站点本身能返回数据。这一步排除 IIS 配置和应用程序池问题。第二层,在服务器上用http://本机内网IP:端口/接口访问,确认绑定不是只绑了 localhost。第三层,在另一台机器上用http://公网IP:端口/接口访问,确认防火墙和安全组都放行。

三层都通过后,再用curl或 Postman 发一个实际请求,检查返回的 JSON 结构和状态码是否符合预期。

# 在外部机器上验证接口连通性和返回内容 curl -X GET "http://服务器IP:8080/api/values" -H "accept: application/json" -w "\nHTTP状态码: %{http_code}\n"

-w参数把 HTTP 状态码打印出来,200 表示接口正常,404 说明路由没匹配上,500 说明服务端有异常。这一步比浏览器更直观,也方便贴到联调群里。

我自己的习惯是,每次部署完新服务器,先把这三层检查走一遍,再打开事件查看器看有没有警告级别的 IIS 日志。从那以后,凡是新环境上线,我都强制走一遍「本机 → 内网 → 公网」的验证流程,不再凭感觉说「应该好了」。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进