使用 Visual Studio ASP.NET Web 部署:部署到测试
作者:Tom Dykstra
本教程系列介绍如何使用 Visual Studio 2017 将 ASP.NET Web 应用程序部署到Azure App 服务 Web 应用或第三方托管提供程序。 有关该系列的信息,请参阅 该系列中的第一个教程。
有关部署到 Azure 的当前版本,请参阅 在 Azure 中创建 ASP.NET Core Web 应用。
概述
在本教程中,你将在本地计算机上将 ASP.NET Web 应用程序部署到 Internet Information Server (IIS)。
通常,在开发应用程序时,可以在 Visual Studio 中运行并对其进行测试。 默认情况下,Visual Studio 2017 中的 Web 应用程序项目使用 IIS Express 作为开发 Web 服务器。 IIS Express 的行为与 Visual Studio 开发服务器(也称为 Cassini)相比,默认情况下 Visual Studio 2017 使用的 IIS 更像完整 IIS。 但两个开发 Web 服务器都与 IIS 完全相同。 因此,应用可以在 Visual Studio 中正确运行和测试,但在部署到 IIS 时失败。
可以通过两种方式可靠地测试应用程序:
使用稍后使用的相同过程将应用程序部署到开发计算机上的 IIS,以便将其部署到生产环境。
可以在运行 Web 项目时将 Visual Studio 配置为使用 IIS,但不会测试部署过程。 此方法验证部署过程,并且应用程序在 IIS 下正常运行。
将应用程序部署到类似于生产环境的测试环境。
这些教程的生产环境在 Azure App 服务 中Web 应用。 理想的测试环境是在 Azure 服务中创建的其他 Web 应用。 虽然它的设置方式与生产 Web 应用相同,但你只会使用它进行测试。
选项 2 是测试的最可靠方法。 如果使用选项 2,则不一定需要使用选项 1。 但是,如果要部署到第三方托管提供程序,则选项 2 可能不可行或成本高昂,因此本教程系列演示了这两种方法。 有关选项 2 的指南,请参阅 “部署到生产环境 ”教程。
有关在 Visual Studio 中使用 Web 服务器的详细信息,请参阅 Visual Studio 中的 Web 服务器,以便 ASP.NET Web 项目。
提醒:如果在完成本教程时收到错误消息或某些内容不起作用,请务必检查 故障排除页面。
下载 Contoso University 初学者项目
下载并安装 Contoso University Visual Studio 初学者解决方案和项目。 此解决方案包含已完成的教程。
安装 IIS
若要部署到开发计算机上的 IIS,请确认已安装 IIS 和 Web 部署。 默认情况下,Visual Studio 安装 Web 部署,但默认 Windows 10、Windows 8 或 Windows 7 配置中不包括 IIS。 如果已安装 IIS 并且默认应用程序池已设置为 .NET 4,请跳到 下一部分。
建议使用 Web 平台安装程序(WPI) 安装 IIS 和 Web 部署。 WPI 会安装建议的 IIS 配置,包括 IIS 和 Web 部署先决条件(如有必要)。
如果已安装 IIS、Web 部署或其任何所需组件,WPI 将仅安装缺少的内容。
使用 Web 平台安装程序安装 IIS 和 Web 部署:
你将看到指示将安装 IIS 7 的消息。 此链接适用于 Windows 8 中的 IIS 8;但对于 Windows 8 及更高版本,请完成以下步骤,确保已安装 ASP.NET 4.7:
打开 控制面板>Programs>程序和功能打开或关闭 Windows 功能。>
展开 Internet 信息服务、万维网服务和应用程序开发功能。
确认已 选择 ASP.NET 4.7 。
确认已选择万维网服务和 IIS 管理控制台。 这将安装 IIS 和 IIS 管理器。
选择“确定”。 显示指示安装正在发生的对话框消息。
安装 IIS 后,运行 IIS 管理器 以确保将 .NET Framework 版本 4 分配给默认应用程序池。
按 WINDOWS+R 打开 “运行 ”对话框。
(在 Windows 8 或更高版本上,在起始页。在 Windows 7 中,从“开始”菜单中选择“运行”。如果“开始”菜单中没有运行,请右键单击任务栏,选择“属性”,选择“开始菜单”选项卡,选择“自定义”,然后选择“运行”命令。
输入“inetmgr”,然后选择“ 确定”。
在 “连接 ”窗格中,展开服务器节点并选择“ 应用程序池”。 在 “应用程序池 ”窗格中,如果 DefaultAppPool 分配到 .NET Framework 版本 4,如下图所示,请跳到下一部分。
如果只看到两个应用程序池并且两者都设置为 .NET Framework 2.0,请在 IIS 中安装 ASP.NET 4。
对于 Windows 8 或更高版本,请参阅上一部分的说明,确保已安装 ASP.NET 4.7,或了解如何 在 Windows 8 和 Windows Server 2012 上安装 ASP.NET 4.5。 对于 Windows 7,在 Windows 开始菜单中右键单击命令提示符并选择“以管理员身份运行”,打开命令提示符窗口。 运行以下命令 运行 aspnet_regiis.exe 以在 IIS 中安装 ASP.NET 4。 (在 32 位系统中,将“Framework64”替换为“Framework”。
cd %windir%\Microsoft.NET\Framework64\v4.0.30319 aspnet_regiis.exe –i
此命令为 .NET Framework 4 创建新的应用程序池,但默认应用程序池将保持设置为 2.0。 你要将面向 .NET 4 的应用程序部署到该应用程序池,因此请将应用程序池更改为 .NET 4。
如果关闭 了 IIS 管理器,请再次运行它,展开服务器节点,然后选择 “应用程序池”。
在 “应用程序池 ”窗格中,选择“ DefaultAppPool”。 在“操作”窗格中,选择“基本设置”。
在 “编辑应用程序池 ”对话框中,将 .NET CLR 版本 更改为 .NET CLR v4.0.30319。 选择“确定”。
现已准备好将 Web 应用程序发布到 IIS。 但是,首先创建用于测试的数据库。
安装 SQL Server Express
LocalDB 不设计用于 IIS,因此测试环境必须安装 SQL Server Express。 如果使用 Visual Studio 2010 SQL Server Express,则默认已安装它。 如果使用的是 Visual Studio 2012 或更高版本,请安装 SQL Server Express。
若要安装 SQL Server Express,请从 下载中心下载并安装它:Microsoft SQL Server 2017 Express 版本。
在 SQL Server 安装中心的第一页上,选择“ 新建 SQL Server 独立安装”或向现有安装 添加功能,并按照接受默认选项的说明进行操作。 在安装向导中,接受默认设置。 有关安装选项的详细信息,请参阅安装向导中的安装 SQL Server(安装程序)。
为测试环境创建 SQL Server Express 数据库
Contoso University 应用程序有两个数据库:
- 成员身份数据库
- 应用程序数据库
可以将这些数据库部署到两个单独的数据库或单个数据库。 将它们组合在一起可以简化数据库联接。
如果要部署到第三方托管提供商,托管计划也可能提供合并它们的理由。 例如,提供程序可能会为多个数据库收取更多费用,甚至可能不允许多个数据库。
在本教程中,你将部署到测试环境中的两个数据库以及过渡环境和生产环境中的一个数据库。
在 Visual Studio 的“视图”菜单中,选择“服务器资源管理器”(Visual Web 开发人员中的数据库资源管理器)。 右键单击 “数据连接 ”,然后选择“ 创建新的 SQL Server 数据库”。
在“新建 SQL Server 数据库”对话框中,在“新建数据库名称”框中输入“.\SQLExpress”,并在“新建数据库名称”框中输入“aspnet-ContosoUniversity”。 选择“确定”。
按照相同的过程创建名为 ContosoUniversity
的新 SQL Server Express School 数据库。
服务器资源管理器 显示两个新数据库。
为新数据库创建授权脚本
当应用程序在开发计算机上在 IIS 中运行时,应用程序将使用默认应用程序池的凭据来访问数据库。 但是,默认情况下,应用程序池无权打开数据库。 这意味着需要运行脚本来授予该权限。 在本部分中,你将创建该脚本,并在以后运行该脚本,以确保应用程序可以在 IIS 中运行时打开数据库。
在文本编辑器中,将以下 SQL 命令复制到新文件中,并将其另存为 Grant.sql。
IF NOT EXISTS (SELECT name FROM sys.server_principals WHERE name = 'IIS APPPOOL\DefaultAppPool')
BEGIN
CREATE LOGIN [IIS APPPOOL\DefaultAppPool]
FROM WINDOWS WITH DEFAULT_DATABASE=[master],
DEFAULT_LANGUAGE=[us_english]
END
GO
CREATE USER [ContosoUniversityUser]
FOR LOGIN [IIS APPPOOL\DefaultAppPool]
GO
EXEC sp_addrolemember 'db_owner', 'ContosoUniversityUser'
GO
在 Visual Studio 中,打开 Contoso University 解决方案。 右键单击解决方案(不是其中一个项目),然后选择“ 添加”。 选择 “现有项”,浏览到 Grant.sql,然后打开它。
注意
此脚本旨在与 SQL Server Express 2012 或更高版本以及 Windows 10、Windows 8 或 Windows 7 中的 IIS 设置配合使用,如本教程中所述。 如果使用的是不同版本的 SQL Server 或 Windows,或者以不同的方式在计算机上设置 IIS,则可能需要更改此脚本。 有关 SQL Server 脚本的详细信息,请参阅 SQL Server 联机丛书。
注意
安全说明 此脚本向在运行时访问数据库的用户授予 db_owner
权限,这是在生产环境中拥有的权限。 在某些情况下,你可能想要指定仅对部署具有完整数据库架构更新权限的用户,并为仅具有读取和写入数据权限的其他用户指定运行时。 有关详细信息,请参阅本教程后面的“查看Code First 迁移的自动 Web.config 更改”。
在应用程序数据库中运行授权脚本
可以将发布配置文件配置为在部署期间在成员身份数据库中运行授予脚本,因为该数据库部署使用 dbDacFx 提供程序。 在部署Code First 迁移期间无法运行脚本,这是部署应用程序数据库的方式。 这意味着在应用程序数据库中部署之前,必须手动运行脚本。
在 Visual Studio 中 ,打开之前创建的Grant.sql 文件。
选择“连接” 。
在 “连接到服务器 ”对话框中,输入 .\SQLExpress 作为 服务器名称。 选择“连接” 。
在数据库下拉列表中,选择 ContosoUniversity。 选择“执行”。
默认应用程序池标识现在在应用程序数据库中具有足够的权限,以便Code First 迁移在应用程序运行时创建数据库表。
发布到 IIS
可通过多种方式使用 Visual Studio 和 Web 部署部署到 IIS:
- 使用 Visual Studio 一键式发布。
- 从命令行发布。
- 创建部署包并使用 IIS 管理器进行安装。 该包具有一个.zip文件,其中包含在 IIS 中安装站点所需的所有文件和元数据。
- 创建部署包并使用命令行进行安装。
在前面的教程中完成的过程,用于设置 Visual Studio 以自动执行部署任务,适用于所有这些方法。 在这些教程中,你将使用前两种方法。 有关使用部署包的信息,请参阅 在用于 Visual Studio 的 Web 部署内容映射和 ASP.NET 中创建和安装 Web 部署包 来部署 Web 应用程序。
发布之前,请确保以管理员模式运行 Visual Studio。 如果在标题栏中看不到 (管理员), 请关闭 Visual Studio。 在 Windows 8(或更高版本) “开始 ”页或 Windows 7 “开始” 菜单中,右键单击 Visual Studio 图标,然后选择“ 以管理员身份运行”。 仅当在本地计算机上发布到 IIS 时,才需要管理员模式。
创建发布配置文件
在解决方案资源管理器中,右键单击 ContosoUniversity 项目(而不是 ContosoUniversity.DAL 项目)。 选择发布。 此时会显示“ 发布” 页。
选择“ 新建配置文件”。 此时会显示“选取发布目标”对话框。
选择 IIS、FTP 等。选择“ 创建配置文件”。 将显示发布向导。
在“发布方法”下拉菜单中,选择“Web 部署”。
对于 服务器,请输入 localhost。
对于 站点名称,请输入 默认网站/ContosoUniversity。
对于 目标 URL,请输入 http://localhost/ContosoUniversity。
不需要目标 URL 设置。 Visual Studio 完成应用程序部署后,会自动将默认浏览器打开到此 URL。 如果不希望浏览器在部署后自动打开,请将此框留空。
选择“ 验证连接 ”以验证设置是否正确,并且可以连接到本地计算机上的 IIS。
绿色复选标记验证连接是否成功。
选择“下一步”以转到“设置”选项卡。
“ 配置 ”下拉列表框指定要部署的生成配置。 将其设置为“发布”的默认值。 本教程中不会部署调试版本。
展开 文件发布选项。 从App_Data文件夹中选择“排除文件”。
在测试环境中,应用程序访问在本地 SQL Server Express 实例中创建的数据库,而不是App_Data文件夹中.mdf文件。
在 发布 期间保留预编译,并在 目标 复选框处删除其他文件。
预编译是一种主要用于大型站点的选项。 它可以减少发布网站后首次请求页面的启动时间。
无需删除其他文件,因为这是第一个部署,目标文件夹中没有任何文件。
注意
如果选择 “在目标 处删除其他文件”以将后续部署到同一站点,请确保使用预览功能,以便在部署之前提前看到将删除哪些文件。 预期行为是 Web 部署将删除项目中已删除的目标服务器上的文件。 但是,将比较源文件夹和目标文件夹下的整个文件夹结构;在某些情况下,Web 部署可能会删除不想删除的文件。
例如,如果将项目部署到根文件夹时,服务器上的子文件夹中有一个 Web 应用程序,则会删除子文件夹。 你可能在 contoso.com 有一个项目用于主站点,另一个项目用于 contoso.com/blog 博客。 博客应用程序位于子文件夹中。 如果在部署主站点时选择“ 删除目标 位置的其他文件”,则会删除博客应用程序。
例如,App_Data文件夹可能会意外删除。 某些数据库(例如 SQL Server Compact)将数据库文件存储在 App_Data 文件夹中。 初始部署后,不希望在后续部署中继续复制数据库文件,因此在“包/发布 Web”选项卡上选择“ 排除App_Data ”。执行此操作后,如果在 目标 位置选择了“删除其他文件”,则下次发布时,数据库文件和App_Data文件夹本身将被删除。
为成员身份数据库配置部署
以下步骤适用于对话框中的“数据库”部分中的 DefaultConnection 数据库。
在“远程连接字符串”框中,输入以下指向新 SQL Server Express 成员身份数据库的连接字符串。
Data Source=.\SQLExpress;Initial Catalog=aspnet-ContosoUniversity;Integrated Security=True
部署过程会将此连接字符串放入已部署的 Web.config 文件中,因为选择在运行时使用此连接字符串。
还可以从服务器资源管理器获取连接字符串。 在 服务器资源管理器中,展开 数据连接 并选择 <machinename>\sqlexpress.aspnet-ContosoUniversity 数据库,然后从 “属性” 窗口中复制 连接字符串 值。 该连接字符串将有一个可以删除的其他设置:
Pooling=False
选择“ 更新数据库”。
这会导致在部署期间在目标数据库中创建数据库架构。 在后续步骤中,指定需要运行的其他脚本:一个用于授予数据库对默认应用程序池的访问权限,另一个用于部署数据。
选择“ 配置数据库更新”。
在 “配置数据库更新 ”对话框中,选择“ 添加 SQL 脚本”。 导航到 之前保存在解决方案文件夹中的 Grant.sql脚本。
重复此过程以添加 aspnet-data-dev.sql 脚本。
选择“关闭”。
为应用程序数据库配置部署
当 Visual Studio 检测到 Entity Framework DbContext
类时,它会在“数据库”部分中创建一个条目,其中包含“执行”Code First 迁移复选框,而不是“更新数据库”复选框。 在本教程中,你将使用该复选框来指定Code First 迁移部署。
在某些情况下,你可能使用的是数据库 DbContext
,但想要使用 dbDacFx 提供程序而不是迁移来部署数据库。 在这种情况下,请参阅 MSDN ASP.NET Web 部署常见问题解答中的如何实现部署 Code First 数据库?
以下步骤适用于对话框的“数据库”部分中的 SchoolContext 数据库。
在“远程连接字符串”框中,输入以下指向新 SQL Server Express 应用程序数据库的连接字符串。
Data Source=.\SQLExpress;Initial Catalog=ContosoUniversity;Integrated Security=True
部署过程会将此连接字符串放入已部署的 Web.config 文件中,因为选择在运行时使用此连接字符串。
还可以从服务器资源管理器获取应用程序数据库连接字符串,就像获取成员身份数据库连接字符串一样。
选择“执行Code First 迁移(在应用程序启动时运行)。
此选项会导致部署过程配置已部署的 Web.config 文件以指定
MigrateDatabaseToLatestVersion
初始值设定项。 当应用程序在部署后首次访问数据库时,此初始值设定项会自动将数据库更新到最新版本。
配置发布配置文件转换
选择“关闭”。 当系统询问是否要保存更改时,请选择“ 是 ”。
在解决方案资源管理器中,展开“属性”,展开“PublishProfiles”。
右键单击 CustomProfile.pubxml 并将其重命名为 Test.pubxml。
右键单击 Test.pubxml。 选择“ 添加配置转换”。
Visual Studio 创建 Web.Test.config 转换文件并打开该文件。
在 Web.Test.config 转换文件中,在打开配置标记后立即插入以下代码。
<appSettings> <add key="Environment" value="Test" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/> </appSettings>
使用测试发布配置文件时,此转换会将环境指示器设置为“测试”。 在已部署的站点中,你将在“Contoso University”H1 标题后面看到“(Test)”。
保存并关闭该文件。
右键单击 Web.Test.config 文件,然后选择“预览转换” 以确保编码的转换 生成预期的更改。
Web.config 预览窗口显示应用 Web.Release.config 转换和 Web.Test.config 转换的结果。
预览部署更新
再次打开发布 Web 向导(右键单击 ContosoUniversity 项目,选择“发布”,然后选择“预览” )。
在“预览”对话框中,选择“开始预览”以查看将复制的文件列表。
还可以选择 预览数据库 链接以查看将在成员身份数据库中运行的脚本。 (没有脚本用于Code First 迁移部署,因此没有预览应用程序数据库。
选择发布。
如果 Visual Studio 不在管理员模式下,可能会收到权限错误消息。 在这种情况下,请关闭 Visual Studio,在管理员模式下打开它,然后再次尝试发布。
如果 Visual Studio 处于管理员模式,“输出”窗口将报告成功生成并发布。
如果在“发布配置文件连接”选项卡上的“目标 URL”框中输入了 URL,浏览器会自动打开在计算机上 IIS 中运行的 Contoso University 主页。
在测试环境中进行测试
请注意,环境指示器显示“(Test)”而不是“(Dev),它显示 环境指示器的 Web.config 转换已成功。
运行“讲师”页,验证 Code First 是否使用讲师数据种子设定了数据库。 选择此页面时,加载可能需要几分钟时间,因为 Code First 会创建数据库,然后运行该方法 Seed
。 (当你在主页上时,它没有这样做,因为应用程序尚未尝试访问数据库。
选择“学生”选项卡以验证已部署的数据库是否没有学生。
从“学生”菜单中选择“添加学生”。 添加学生,然后在“学生”页中查看新学生。 这将验证是否可以成功写入数据库。
在 “课程 ”菜单中,选择“ 更新额度”。 “ 更新额度 ”页需要管理员权限,以便 显示“登录 ”页。 输入之前创建的管理员帐户凭据(“admin”和“devpwd”)。 将显示“更新信用额度”页。 这将验证在上一教程中创建的管理员帐户是否已正确部署到测试环境。
验证 ELMAH 文件夹是否存在于 c:\inetpub\wwwroot\ContosoUniversity 文件夹中,其中只有占位符文件。
查看Code First 迁移的自动 Web.config 更改
在 C:\inetpub\wwwroot\ContosoUniversity 的已部署应用程序中打开 Web.config 文件,可以看到将部署过程配置为将数据库自动更新到最新版本的位置Code First 迁移。
部署过程还创建了一个新的连接字符串,供Code First 迁移专门用于更新数据库架构:
通过此附加连接字符串,你可以为数据库架构更新指定一个用户帐户,并为应用程序数据访问指定不同的用户帐户。 例如,可以将db_owner角色分配给Code First 迁移,并将具有db_datawriter角色的db_datareader分配给应用程序。 这是一种常见的深度防御模式,可防止应用程序中的潜在恶意代码更改数据库架构。 (例如,这可能发生在成功的 SQL 注入攻击中。这些教程不使用此模式。 若要在方案中实现此模式,请执行以下步骤:
在“设置”选项卡下的“发布 Web 向导”中,输入指定具有完整数据库架构更新权限的用户的连接字符串。 清除“在运行时使用此连接字符串”复选框。 在已部署的 Web.config 文件中,这将成为
DatabasePublish
连接字符串。为希望应用程序在运行时使用的连接字符串创建 Web.config 文件转换。
总结
现在,你已将应用程序部署到开发计算机上的 IIS,并在其中进行了测试。
这将验证部署过程是否已将应用程序的内容复制到正确的位置(不包括不想部署的文件),以及 Web 部署在部署期间正确配置了 IIS。 在下一个教程中,你将运行一个测试,该测试查找尚未完成的部署任务:设置 Elm ah 文件夹的文件夹权限。
详细信息
有关在 Visual Studio 中运行 IIS 或 IIS Express 的信息,请参阅以下资源: