Windows IIS 部署 .NET 应用详细指南
本文档提供了在 Windows Server 上使用 IIS 部署 .NET 应用(包括 .NET Core 和传统 WebForms)的完整步骤和最佳实践。
目录
- 概述
- 环境准备
- .NET Core 应用部署
- 应用准备
- 发布应用
- 在 IIS 中配置
- 应用池配置
- 高级配置
- .NET Framework WebForms 应用部署
- 应用准备
- 发布应用
- 在 IIS 中配置
- 应用池配置
- 高级配置
- 多应用部署
- 配置 HTTPS
- 性能优化
- 日志管理
- 故障排除
- 最佳实践
- 高级部署场景
- 特定版本部署指南
- 部署检查清单
- 结论
- 附录:常用命令参考
概述
.NET 应用程序有多种托管方式,而 IIS 是 Windows 环境中最常用的 Web 服务器选择。本指南涵盖了两种主要的 .NET 应用类型的部署:
- .NET Core/.NET 5+:现代跨平台 .NET 应用框架
- .NET Framework WebForms:传统的 Windows-only .NET 应用框架
这两种应用类型的部署流程有所不同:
- .NET Core 应用通常是独立的(self-contained)或依赖框架的(framework-dependent)应用程序
- WebForms 应用直接部署到 IIS 站点目录中
环境准备
Windows Server 准备
-
安装 Windows Server:
- 建议使用 Windows Server 2016/2019/2022
- 安装所有最新更新
-
安装 IIS:
- 打开服务器管理器 → 添加角色和功能
- 选择"Web 服务器 (IIS)"角色
- 确保以下功能已选中:
- Web 服务器 → 通用 HTTP 功能 → 默认文档
- Web 服务器 → 通用 HTTP 功能 → 静态内容
- Web 服务器 → 通用 HTTP 功能 → HTTP 错误
- Web 服务器 → 应用程序开发 → .NET Extensibility 4.8
- Web 服务器 → 应用程序开发 → ASP.NET 4.8
- Web 服务器 → 应用程序开发 → ISAPI 扩展
- Web 服务器 → 应用程序开发 → ISAPI 筛选器
- 管理工具 → IIS 管理控制台
.NET Core 准备工作
-
安装 .NET Core Hosting Bundle:
- 从 Microsoft 官方网站 下载适合目标 .NET 版本的 Hosting Bundle
- 例如,对于 .NET 6 应用,下载 .NET 6.0 Hosting Bundle
- 运行安装程序并按照向导完成安装
-
安装 Visual C++ Redistributable:
- 下载并安装 Visual C++ Redistributable
- 这是 .NET Core 运行时的依赖项
-
IIS 配置:
- 在安装 Hosting Bundle 后,重启 IIS:
iisreset /restart
- 在安装 Hosting Bundle 后,重启 IIS:
.NET Framework 准备工作
-
安装 .NET Framework:
- 使用"添加角色和功能"向导安装 .NET Framework 4.8(或应用所需的版本)
- 路径:服务器管理器 → 添加角色和功能 → 功能 → .NET Framework 4.8
-
安装 Web Deploy(可选但推荐):
- 从 Microsoft 官方网站 下载 Web Deploy
- 运行安装程序,选择"完整安装"选项
.NET Core 应用部署
.NET Core 应用准备
-
检查 .NET Core 应用要求:
- 确认目标应用兼容的 .NET 版本(.NET Core 3.1、.NET 5、.NET 6 等)
- 确保服务器安装了匹配的 .NET 运行时
-
配置应用:
- 在
appsettings.json
中设置生产环境配置:{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","ConnectionStrings": {"DefaultConnection": "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"} }
- 在
-
配置 web.config:
- 在项目中添加或修改
web.config
文件:<?xml version="1.0" encoding="utf-8"?> <configuration><location path="." inheritInChildApplications="false"><system.webServer><handlers><add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /></handlers><aspNetCore processPath="dotnet" arguments=".\MyApplication.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" /></system.webServer></location> </configuration>
- 在项目中添加或修改
发布 .NET Core 应用
-
使用 Visual Studio 发布:
- 右键点击项目 → 发布
- 选择"文件夹"作为发布目标
- 配置发布选项:
- 配置:Release
- 目标框架:应用程序的目标框架(如 .NET 6.0)
- 部署模式:根据需要选择"依赖框架"或"自包含"
- 目标运行时:win-x64(或适合目标服务器的其他运行时)
- 点击"发布"按钮
-
使用 dotnet CLI 发布:
- 打开命令提示符或 PowerShell
- 导航到项目目录
- 对于依赖框架的部署:
dotnet publish -c Release -o ./publish
- 对于自包含部署:
dotnet publish -c Release -r win-x64 --self-contained -o ./publish
-
准备发布文件夹:
- 将发布输出复制到服务器上的部署文件夹,例如:
C:\inetpub\wwwroot\MyDotNetCoreApp
- 或直接在 CI/CD 流程中发布到服务器
- 将发布输出复制到服务器上的部署文件夹,例如:
在 IIS 中配置 .NET Core 应用
-
创建新应用程序池:
- 打开 IIS 管理器
- 右键点击"应用程序池" → “添加应用程序池”
- 名称:
MyDotNetCoreAppPool
- .NET CLR 版本:
无托管代码
- 托管管道模式:
集成
- 点击"确定"
-
创建网站或应用程序:
选项 1:创建新网站:
- 右键点击"网站" → “添加网站”
- 站点名称:
MyDotNetCoreApp
- 应用程序池:选择刚创建的应用程序池
- 物理路径:指向发布文件夹(例如
C:\inetpub\wwwroot\MyDotNetCoreApp
) - 绑定:设置 HTTP 绑定(端口、主机名等)
- 点击"确定"
选项 2:在现有网站下添加应用程序:
- 右键点击现有网站 → “添加应用程序”
- 别名:
MyDotNetCoreApp
- 应用程序池:选择刚创建的应用程序池
- 物理路径:指向发布文件夹
- 点击"确定"
-
设置目录权限:
- 右键点击应用程序物理路径 → “属性” → “安全” → “编辑”
- 添加 IIS_IUSRS 用户组和应用程序池身份(例如
IIS AppPool\MyDotNetCoreAppPool
) - 至少授予"读取和执行"、“列出文件夹内容”、"读取"权限
- 对于需要写入的目录(如日志目录),授予"修改"权限
- 点击"确定"应用更改
.NET Core 应用池配置
-
配置应用程序池高级设置:
- 右键点击应用程序池 → “高级设置”
- 设置"启用32位应用程序"为"False"(对于 64 位应用)
- 可根据需要调整其他设置(如闲置超时、回收等)
- 点击"确定"
-
配置 ASP.NET Core 模块:
- 在
web.config
中可以配置 ASP.NET Core 模块的行为:<aspNetCore processPath="dotnet" arguments=".\MyApplication.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
hostingModel
可以是inprocess
(默认,性能更好)或outofprocess
(隔离性更好)
- 在
.NET Core 高级配置
-
配置 URL 重写(如果需要):
- 安装 URL Rewrite 模块(如果尚未安装)
- 配置
web.config
以包含 URL 重写规则:<system.webServer><rewrite><rules><rule name="Redirect to HTTPS" stopProcessing="true"><match url="(.*)" /><conditions><add input="{HTTPS}" pattern="^OFF$" /></conditions><action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" /></rule></rules></rewrite> </system.webServer>
-
配置应用程序初始化(预热):
- 在
web.config
中添加配置:<system.webServer><applicationInitialization doAppInitAfterRestart="true"><add initializationPage="/" /></applicationInitialization> </system.webServer>
- 在站点或应用程序的高级设置中设置"预加载已启用"为"True"
- 在
-
配置环境变量:
- 在 web.config 中设置环境变量:
<aspNetCore processPath="dotnet" arguments=".\MyApplication.dll"><environmentVariables><environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" /><environmentVariable name="ConnectionStrings__DefaultConnection" value="Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;" /></environmentVariables> </aspNetCore>
- 在 web.config 中设置环境变量:
.NET Framework WebForms 应用部署
WebForms 应用准备
-
检查 .NET Framework 版本:
- 确认应用程序的目标 .NET Framework 版本(例如 4.0、4.5、4.8)
- 确保服务器已安装该版本
-
配置 Web.config:
- 确保
Web.config
文件中的连接字符串和应用设置适合生产环境:<configuration><connectionStrings><add name="DefaultConnection" connectionString="Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;" providerName="System.Data.SqlClient" /></connectionStrings><appSettings><add key="Environment" value="Production" /></appSettings><!-- 其他配置 --> </configuration>
- 确保
-
准备应用程序文件:
- 确保所有必要的依赖项和引用都已包含在项目中
- 确保所有路径都是相对路径,以便在部署环境中正常工作
发布 WebForms 应用
-
使用 Visual Studio 发布:
- 右键点击项目 → 发布
- 选择发布方法:
- Web Deploy:直接发布到 IIS(需要安装 Web Deploy)
- FTP:通过 FTP 发布
- 文件系统:发布到本地文件夹
- 配置发布参数:
- 对于 Web Deploy:输入服务器 URL、站点名称、用户名和密码
- 对于文件系统:选择输出文件夹
- 配置发布选项:
- 配置:Release
- 文件发布选项:视需要选择"删除目标位置中的其他文件"
- 点击"发布"按钮
-
手动发布:
- 生成 Release 版本的应用程序
- 复制
bin
、App_Data
、App_Themes
及其他必要文件夹 - 复制所有
.aspx
、.ascx
、.master
文件 - 复制
Web.config
和其他配置文件 - 将文件复制到服务器上的部署文件夹
在 IIS 中配置 WebForms 应用
-
创建新应用程序池:
- 打开 IIS 管理器
- 右键点击"应用程序池" → “添加应用程序池”
- 名称:
MyWebFormsAppPool
- .NET CLR 版本:
.NET CLR v4.0.30319
(或应用程序所需的 .NET Framework 版本) - 托管管道模式:
集成
- 点击"确定"
-
创建网站或应用程序:
选项 1:创建新网站:
- 右键点击"网站" → “添加网站”
- 站点名称:
MyWebFormsApp
- 应用程序池:选择刚创建的应用程序池
- 物理路径:指向部署文件夹(例如
C:\inetpub\wwwroot\MyWebFormsApp
) - 绑定:设置 HTTP 绑定(端口、主机名等)
- 点击"确定"
选项 2:在现有网站下添加应用程序:
- 右键点击现有网站 → “添加应用程序”
- 别名:
MyWebFormsApp
- 应用程序池:选择刚创建的应用程序池
- 物理路径:指向部署文件夹
- 点击"确定"
-
设置目录权限:
- 右键点击应用程序物理路径 → “属性” → “安全” → “编辑”
- 添加 IIS_IUSRS 用户组和应用程序池身份(例如
IIS AppPool\MyWebFormsAppPool
) - 至少授予"读取和执行"、“列出文件夹内容”、"读取"权限
- 对于特殊文件夹如
App_Data
,授予"修改"权限 - 点击"确定"应用更改
WebForms 应用池配置
-
配置应用程序池高级设置:
- 右键点击应用程序池 → “高级设置”
- 根据应用程序要求,设置"启用32位应用程序"为"True"或"False"
- 配置回收设置:
- 定期回收间隔:根据应用需求调整(0 表示禁用定期回收)
- 闲置超时:如果需要保持应用程序在内存中,设置较长的时间
- 点击"确定"
-
配置应用程序池身份:
- 默认情况下,应用程序池使用 ApplicationPoolIdentity
- 如果需要,可以设置为特定用户:
- 高级设置 → 进程模型 → 标识 → 自定义账户
- 输入一个具有足够权限的域或本地用户账户
WebForms 高级配置
-
配置会话状态:
在Web.config
中配置会话状态模式:<system.web><sessionState mode="StateServer" stateConnectionString="tcpip=localhost:42424" timeout="20" /><!-- 或者使用 SQL Server --><!-- <sessionState mode="SQLServer" sqlConnectionString="..." timeout="20" /> --> </system.web>
-
配置自定义错误页:
<system.web><customErrors mode="RemoteOnly" defaultRedirect="~/Error.aspx"><error statusCode="404" redirect="~/NotFound.aspx" /><error statusCode="500" redirect="~/ServerError.aspx" /></customErrors> </system.web>
-
配置应用程序预热:
- 安装 Application Initialization 模块(如果尚未安装)
- 在站点或应用程序的高级设置中设置"预加载已启用"为"True"
- 在
Web.config
中添加:<system.webServer><applicationInitialization doAppInitAfterRestart="true"><add initializationPage="/" hostName="example.com" /></applicationInitialization> </system.webServer>
多应用部署
管理多个 .NET 应用
-
使用单独的应用程序池:
- 为每个应用程序创建独立的应用程序池
- 确保应用程序池的 .NET CLR 版本与应用程序兼容
-
域名和子域部署:
- 配置多个站点,每个使用不同的域名或子域
- 在 IIS 中添加多个绑定,每个绑定使用不同的主机名
-
子应用程序部署:
- 在主网站下添加多个应用程序
- 每个应用程序使用自己的应用程序池
- 配置适当的虚拟路径
-
管理资源分配:
- 为不同的应用程序池分配不同的资源限制(内存、CPU 等)
- 配置高级应用程序池设置以优化性能
配置 HTTPS
设置 SSL/TLS
-
获取 SSL 证书:
- 从证书颁发机构购买证书
- 使用 Let’s Encrypt 免费证书
- 创建自签名证书(仅适用于开发/测试环境)
-
安装证书:
- 打开 IIS 管理器 → 选择服务器 → “服务器证书”
- 点击"导入"(如果已有 PFX 文件)或"创建证书请求"(如果需要申请新证书)
- 按照向导完成证书导入或请求
-
配置 HTTPS 绑定:
- 选择网站 → “绑定…” → “添加”
- 类型:选择"https"
- IP 地址:选择适当的 IP 地址或"全部未分配"
- 端口:通常为 443
- 主机名:输入域名(可选)
- SSL 证书:选择已安装的证书
- 点击"确定"
-
配置 HTTP 到 HTTPS 重定向:
- 安装 URL Rewrite 模块(如果尚未安装)
- 添加重写规则将 HTTP 请求重定向到 HTTPS:
<system.webServer><rewrite><rules><rule name="HTTP to HTTPS" stopProcessing="true"><match url="(.*)" /><conditions><add input="{HTTPS}" pattern="^OFF$" /></conditions><action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" /></rule></rules></rewrite> </system.webServer>
-
配置 HSTS(HTTP 严格传输安全):
- 添加 HTTP 响应头:
<system.webServer><httpProtocol><customHeaders><add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains" /></customHeaders></httpProtocol> </system.webServer>
- 添加 HTTP 响应头:
性能优化
IIS 性能调优
-
启用压缩:
- 打开 IIS 管理器 → 选择服务器 → “压缩”
- 勾选"启用静态内容压缩"和"启用动态内容压缩"
- 配置压缩级别和其他设置
-
启用输出缓存:
- 选择网站或应用程序 → “输出缓存”
- 添加缓存规则以缓存静态内容和不经常变化的动态内容
-
优化应用程序池:
- 配置应用程序池回收设置以减少不必要的回收
- 使用应用程序预热确保快速响应
- 根据服务器资源分配适当的进程数量
.NET 应用性能优化
-
.NET Core 性能优化:
- 在发布时使用
--configuration Release
选项 - 使用响应压缩中间件:
app.UseResponseCompression();
- 实现缓存策略:
services.AddResponseCaching(); app.UseResponseCaching();
- 在发布时使用
-
WebForms 性能优化:
- 在
Web.config
中启用输出缓存:<system.web><caching><outputCache enableOutputCache="true" /><outputCacheSettings><outputCacheProfiles><add name="CacheFor1Minute" duration="60" varyByParam="none" /></outputCacheProfiles></outputCacheSettings></caching> </system.web>
- 使用页面输出缓存:
<%@ OutputCache Duration="60" VaryByParam="none" %>
- 优化视图状态大小:
<%@ Page EnableViewState="false" %>
- 在
日志管理
配置 IIS 日志
-
配置 IIS 站点日志:
- 选择网站 → “日志记录”
- 配置日志文件格式(W3C 扩展、IIS、NCSA 或自定义)
- 设置日志文件路径和轮换选项
- 选择需要记录的字段
-
配置 FREB 日志(失败请求跟踪):
- 选择网站或应用程序 → “失败请求跟踪规则”
- 添加新规则,指定触发日志记录的条件(如状态码、时间等)
- 配置要包含在日志中的详细信息
配置应用程序日志
-
.NET Core 日志配置:
- 在
appsettings.json
中配置日志记录:{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"},"File": {"Path": "logs/app.log","FileSizeLimitBytes": 10485760,"MaxRollingFiles": 10}} }
- 使用第三方日志记录库如 Serilog 或 NLog 进行高级日志配置
- 在
-
WebForms 日志配置:
- 使用
web.config
配置健康监视和跟踪:<system.web><healthMonitoring enabled="true"><!-- 健康监视配置 --></healthMonitoring><trace enabled="true" localOnly="true" /> </system.web>
- 使用 log4net 或其他日志库进行应用程序级日志记录
- 使用
故障排除
常见 IIS 错误
-
HTTP 500.19 - Internal Server Error:
- 通常是
web.config
配置错误 - 检查配置文件语法
- 确保服务器已安装所有必要的 IIS 模块
- 通常是
-
HTTP 500.21 - Internal Server Error:
- 通常是 .NET Core/.NET 5+ 处理程序映射或模块问题
- 确认已安装 ASP.NET Core Hosting Bundle
- 检查
web.config
中的处理程序配置
-
HTTP 503 - Service Unavailable:
- 应用程序池可能已停止
- 检查应用程序池状态
- 查看事件日志中的应用程序崩溃或其他问题
.NET Core 应用排错
-
检查日志:
- 检查
stdoutLogFile
指定的位置 - 检查 Windows 事件日志
- 检查应用程序自定义日志
- 检查
-
检查模块安装:
- 确认 ASP.NET Core 模块已正确安装和注册
- 在命令行运行
dotnet --info
确认 .NET 运行时版本
-
检查进程:
- 使用任务管理器或 Process Explorer 确认
w3wp.exe
(应用程序池)和dotnet.exe
(对于 out-of-process 托管)进程正在运行
- 使用任务管理器或 Process Explorer 确认
WebForms 应用排错
-
-
启用详细错误消息:
-
配置
customErrors
模式:<system.web><customErrors mode="Off" /> </system.web>
-
查看详细错误输出
-
-
检查脚本错误:
- 使用浏览器开发者工具检查 JavaScript 错误
- 配置
<deployment retail="false">
以获取详细错误信息
-
检查权限:
- 确保应用程序池身份有权访问所有必要的资源(文件、数据库等)
- 为 App_Data 目录授予修改权限
- 确保任何外部资源(如 UNC 路径、外部 API)的权限正确
-
检查数据库连接:
- 验证连接字符串是否正确
- 确保数据库服务器可访问
- 检查数据库用户权限
最佳实践
安全最佳实践
-
保持系统更新:
- 定期安装 Windows 更新
- 更新 .NET Framework、.NET Core 运行时到最新的安全补丁版本
- 保持 IIS 和其模块的最新状态
-
应用安全配置:
-
配置适当的 web.config 安全设置:
<system.web><httpRuntime enableVersionHeader="false" /><httpCookies httpOnlyCookies="true" requireSSL="true" /> </system.web>
-
配置安全 HTTP 头:
<system.webServer><httpProtocol><customHeaders><remove name="X-Powered-By" /><add name="X-Frame-Options" value="SAMEORIGIN" /><add name="X-XSS-Protection" value="1; mode=block" /><add name="X-Content-Type-Options" value="nosniff" /></customHeaders></httpProtocol> </system.webServer>
-
-
实施身份验证和授权:
- 使用安全的身份验证机制(如 ASP.NET Identity、Windows 认证)
- 配置适当的授权策略
- 考虑实施 2FA(双因素认证)
-
保护敏感数据:
- 加密连接字符串和敏感配置信息
- 使用 HTTPS 加密传输中的数据
- 适当实施数据保护 API
部署最佳实践
-
实施 CI/CD 流程:
- 使用 Azure DevOps、GitHub Actions 或其他 CI/CD 工具自动化部署
- 实施部署前的自动化测试
- 使用 Web Deploy 或其他部署工具进行零停机部署
-
版本控制部署文件夹:
- 使用带时间戳的文件夹命名约定
- 保留多个版本以便快速回滚
- 使用符号链接指向当前活动版本
-
应用配置转换:
- 使用 XML 配置转换针对不同环境(如开发、测试、生产)
- 使用环境变量或其他安全方式存储敏感配置
-
使用蓝绿部署或金丝雀发布:
- 设置两个相同的环境进行蓝绿部署
- 将一小部分流量路由到新版本进行金丝雀测试
监控和维护最佳实践
-
设置监控:
- 使用 Application Insights、New Relic 或类似工具监控应用性能
- 设置警报以通知异常情况
- 定期检查应用程序和 IIS 日志
-
定期备份:
- 备份网站内容和配置
- 备份 IIS 配置(使用
appcmd
或导出功能) - 备份 SSL 证书和其他安全凭据
-
定期维护:
- 定期清理日志文件
- 优化数据库(如适用)
- 检查和优化应用程序池回收设置
-
灾难恢复计划:
- 制定完整的灾难恢复流程
- 定期测试恢复流程
- 保持离线文档和关键信息
高级部署场景
负载均衡和高可用性
-
配置 Web 场:
- 设置多个运行相同应用程序的 Web 服务器
- 使用 ARR(Application Request Routing)或硬件负载均衡器分配流量
- 确保会话状态在服务器之间共享
-
配置共享内容:
- 使用 DFS(分布式文件系统)或共享存储
- 确保所有 Web 场服务器都可访问共享内容
- 适当配置 ACL(访问控制列表)
-
配置粘性会话(如需要):
- 在 ARR 中配置服务器亲和性
- 或使用分布式缓存如 Redis 进行会话存储
容器化部署
-
使用 Docker 容器:
- 为 .NET Core/.NET 5+ 应用创建 Dockerfile
- 使用 Windows 容器或 Linux 容器(取决于应用程序要求)
- 配置容器编排(如 Kubernetes)
-
配置 IIS 反向代理:
- 在容器环境前使用 IIS 作为反向代理
- 配置 URL 重写规则将请求路由到容器
-
使用 Windows Container Networking:
- 配置容器网络以允许容器间通信
- 确保容器可访问必要的外部资源(如数据库)
微服务架构部署
-
服务发现:
- 使用服务注册表(如 Consul、Eureka)
- 配置 API 网关路由请求到不同服务
-
独立部署:
- 为每个微服务配置独立的 IIS 站点或应用程序
- 使用不同的应用程序池隔离服务
-
监控和日志聚合:
- 集中收集和分析所有微服务的日志
- 实施分布式跟踪以监控请求流
特定版本部署指南
.NET 6/7/8 应用部署
-
安装最新 Hosting Bundle:
- 从 Microsoft 下载并安装对应版本的 .NET Hosting Bundle
- 例如,对于 .NET 8 应用,安装 .NET 8.0 Hosting Bundle
-
配置特定功能:
- 配置最小 API 和其他 .NET 6+ 新功能的 IIS 集成
- 使用最新的部署模式(如自包含部署、单文件发布)
-
优化性能:
- 使用 .NET 6+ 的性能增强功能
- 配置 Kestrel 设置以优化 in-process 和 out-of-process 模式
.NET Framework 4.8 应用部署
-
安装 .NET Framework 4.8:
- 在服务器上安装完整的 .NET Framework 4.8
- 安装相关的安全补丁和更新
-
配置传统功能:
- 配置 Classic ASP.NET 功能(如会话状态、视图状态)
- 适当设置应用程序池回收和 ASP.NET 并发设置
-
兼容性考虑:
- 处理任何遗留组件的兼容性问题
- 确保在 4.8 环境中测试所有功能
部署检查清单
.NET Core/.NET 5+ 部署检查清单
-
前期准备:
- 安装了适当版本的 .NET Hosting Bundle
- 安装了必要的 IIS 功能和模块
- 安装了 Visual C++ Redistributable
-
应用程序构建:
- 使用正确的配置(Release)构建应用
- 配置了适当的运行时(依赖框架或自包含)
- 测试构建的发布包在本地运行正常
-
IIS 配置:
- 创建了应用程序池(无托管代码)
- 创建了网站或应用程序
- 设置了正确的目录权限
- 配置了 web.config 文件
-
测试和监控:
- 从外部客户端测试应用程序
- 检查日志确认没有错误
- 设置了监控和警报
WebForms 部署检查清单
-
前期准备:
- 服务器安装了正确版本的 .NET Framework
- 安装了必要的 IIS 功能和模块
- 安装了 Web Deploy(如使用)
-
应用程序构建:
- 使用正确的 Web.config 转换
- 移除了开发工具和调试符号
- 确保所有依赖项都已包含
-
IIS 配置:
- 创建了应用程序池(正确的 .NET CLR 版本)
- 创建了网站或应用程序
- 设置了正确的目录权限
- 配置了应用程序池高级设置
-
测试和监控:
- 测试所有关键功能
- 验证数据库连接和其他集成
- 检查日志确认没有错误
结论
在 Windows IIS 上部署 .NET 应用程序需要仔细规划和配置。无论是现代的 .NET Core/.NET 5+ 应用还是传统的 WebForms 应用,本指南提供了全面的步骤和最佳实践,帮助您成功部署和维护高性能、安全的 Web 应用程序。
通过遵循本指南中的步骤和最佳实践,您可以确保应用程序的可靠性、性能和安全性,同时简化未来的维护和升级过程。
附录:常用命令参考
IIS 命令行工具 (appcmd)
# 列出所有站点 %windir%\system32\inetsrv\appcmd list site# 列出所有应用程序池 %windir%\system32\inetsrv\appcmd list apppool# 重启应用程序池 %windir%\system32\inetsrv\appcmd recycle apppool /apppool.name:"MyAppPool"# 启动/停止站点 %windir%\system32\inetsrv\appcmd start site /site.name:"MySite" %windir%\system32\inetsrv\appcmd stop site /site.name:"MySite"# 备份 IIS 配置 %windir%\system32\inetsrv\appcmd add backup "MyBackup"# 恢复 IIS 配置 %windir%\system32\inetsrv\appcmd restore backup "MyBackup"
PowerShell IIS 命令 (WebAdministration)
# 导入 IIS 模块 Import-Module WebAdministration# 列出所有站点 Get-Website# 列出所有应用程序池 Get-ChildItem IIS:\AppPools\# 重启应用程序池 Restart-WebAppPool -Name "MyAppPool"# 启动/停止站点 Start-Website -Name "MySite" Stop-Website -Name "MySite"# 创建新站点 New-Website -Name "NewSite" -PhysicalPath "C:\inetpub\wwwroot\newsite" -ApplicationPool "NewSiteAppPool"# 创建新应用程序池 New-WebAppPool -Name "NewAppPool"
.NET CLI 命令
# 发布 .NET Core 应用 (Framework-dependent) dotnet publish -c Release -o ./publish# 发布 .NET Core 应用 (Self-contained) dotnet publish -c Release -r win-x64 --self-contained -o ./publish# 运行应用(测试) dotnet run# 查看安装的 .NET 版本 dotnet --info
Web Deploy 命令
# 打包 Web 应用程序 msdeploy -verb:sync -source:iisApp="C:\inetpub\wwwroot\myapp" -dest:package=C:\temp\myapp.zip# 部署 Web 应用程序 msdeploy -verb:sync -source:package=C:\temp\myapp.zip -dest:iisApp="Default Web Site/myapp" -skip:objectName=filePath,absolutePath=".+\\.config$" -enableRule:DoNotDeleteRule# 同步两个 IIS 站点 msdeploy -verb:sync -source:iisApp="Default Web Site/source" -dest:iisApp="Default Web Site/destination"
IIS 诊断命令
# 检查 IIS 状态 iisreset /status# 启动 IIS iisreset /start# 停止 IIS iisreset /stop# 重启 IIS iisreset /restart# 检查 ASP.NET 注册情况 %windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis -lv# 重新注册 ASP.NET %windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis -i
.NET Core 诊断命令
# 检查 .NET Core 运行时安装 dotnet --info# 验证 .NET Core 应用 dotnet --verify myapplication.dll# 列出所有已安装的 .NET Core runtimes dotnet --list-runtimes# 检查 ASP.NET Core 模块安装 %windir%\System32\inetsrv\appcmd list modules /module.name:"AspNetCoreModuleV2"
性能监控命令
# 监视 IIS Worker 进程 Get-Process w3wp | Select-Object Id, ProcessName, @{Name="AppPool";Expression={(Get-WmiObject Win32_Process -Filter "ProcessId='$($_.Id)'").CommandLine -match "[-]ap[p]pool[:]([^\s]*)";$matches[1]}}, @{Name="Threads";Expression={$_.Threads.Count}}, @{Name="Memory";Expression={[Math]::Round($_.WorkingSet64/1MB,2)}}# 获取 IIS 性能计数器 Get-Counter -Counter "\Web Service(_Total)\Current Connections" Get-Counter -Counter "\ASP.NET Applications(__Total__)\Requests/Sec" Get-Counter -Counter "\ASP.NET\Requests Queued"
附录:IIS 常见故障排除参考
HTTP 错误代码排错参考
错误代码 常见原因 排查方向 500 应用程序错误 检查应用程序错误日志、调试模式查看详细信息 500.19 配置错误 检查 web.config 语法、确认模块安装 500.21 模块未安装 安装必要的模块(如 ASP.NET Core Module) 502.5 进程故障 检查应用程序能否独立运行,检查权限 503 应用程序池不可用 检查应用程序池状态,查看事件日志 404 资源不存在 检查路径、URL 重写规则、路由配置 401 未授权 检查认证设置、用户权限 403 禁止访问 检查文件/目录权限、IP 限制、URL 授权 事件日志位置
- 应用程序事件日志: 在 Windows 事件查看器中,
Windows Logs -> Application
- IIS 日志: 默认位置
%SystemDrive%\inetpub\logs\LogFiles
- .NET Core 标准输出日志: 在 web.config 中由
stdoutLogFile
属性指定 - ASP.NET 应用程序日志: 由应用程序配置决定,通常在 App_Data 或专用日志目录
故障排除工具
-
Failed Request Tracing (FREB):
- 配置详细的请求跟踪,记录请求处理的每一步
- 可用于诊断复杂的 IIS 和应用程序交互问题
-
Process Monitor:
- 监控文件系统、注册表和进程活动
- 用于诊断权限问题和资源访问问题
-
Process Explorer:
- 详细查看进程信息、加载的模块和线程
- 分析应用程序池进程问题
-
Debug Diagnostic Tool:
- 分析内存转储和应用程序崩溃
- 诊断内存泄漏和性能问题
-
Network Monitor:
- 分析网络流量
- 诊断与外部资源的连接问题
模块检测命令
# 检查 URL Rewrite 模块 %windir%\System32\inetsrv\appcmd list modules /module.name:"RewriteModule"# 检查 ASP.NET Core 模块 %windir%\System32\inetsrv\appcmd list modules /module.name:"AspNetCoreModuleV2"# 检查应用程序初始化模块 %windir%\System32\inetsrv\appcmd list modules /module.name:"ApplicationInitializationModule"# 列出所有已安装的模块 %windir%\System32\inetsrv\appcmd list modules
安全性检查工具
-
IIS Crypto:
- 配置 SSL/TLS 设置
- 实施安全最佳实践
-
Security Compliance Manager:
- 应用安全基线
- 验证 IIS 和 Windows 设置
-
URL Scan:
- 过滤恶意请求
- 加强 IIS 安全性
通过掌握这些工具和命令,您将能够更有效地诊断和解决 IIS 中的 .NET 应用程序部署问题。
-