使用 Visual Studio ASP.NET Web 部署:部署到测试

作者 :Tom Dykstra

本教程系列介绍如何使用 Visual Studio 2017 将 (发布) ASP.NET Web 应用程序部署到Azure 应用服务 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的行为更像完整的 IIS,而不是 Visual Studio 开发服务器 (也称为 Cassini) ,Visual Studio 2017 默认使用。 但是,这两个开发 Web 服务器的工作方式都与 IIS 完全相同。 因此,应用可以在 Visual Studio 中正确运行和测试,但在部署到 IIS 时会失败。

可以通过两种方式可靠地测试应用程序:

  1. 使用稍后将应用程序部署到生产环境的相同过程,将应用程序部署到开发计算机上的 IIS。

    可以将 Visual Studio 配置为在运行 Web 项目时使用 IIS,但这不会测试部署过程。 此方法验证部署过程,以及应用程序在 IIS 下是否正确运行。

  2. 将应用程序部署到与生产环境类似的测试环境。

    这些教程的生产环境在 Azure 应用服务 中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 部署,但 IIS 不包含在默认Windows 10、Windows 8或 Windows 7 配置中。 如果已安装 IIS 并且默认应用程序池已设置为 .NET 4,请跳到 下一部分

  1. 建议使用 Web 平台安装程序 (WPI) 来安装 IIS 和 Web 部署。 如有必要,WPI 会安装建议的 IIS 配置,其中包括 IIS 和 Web 部署先决条件。

    如果已安装 IIS、Web 部署或其任何所需组件,则 WPI 仅安装缺少的内容。

    • 使用 Web 平台安装程序安装 IIS 和 Web 部署:

      使用 WPI 安装 IIS

      使用 WPI 安装 Web 部署

      你将看到指示将安装 IIS 7 的消息。 此链接适用于 Windows 8 中的 IIS 8;但对于Windows 8及更高版本,请执行以下步骤以确保已安装 ASP.NET 4.7:

    • 打开 控制面板>Programs>程序和功能>打开或关闭 Windows 功能

    • 展开“Internet 信息服务”、“万维网服务和应用程序开发功能”。

    • 确认已选择 ASP.NET 4.7

      选择 ASP.NET 4.7

    • 确认已选择 万维网服务和IIS 管理控制台 。 这将安装 IIS 和 IIS 管理器。

      选择“万维网服务”

    • 选择“确定” 。 显示指示正在进行安装的对话框消息。

安装 IIS 后,运行 IIS 管理器,确保将.NET Framework版本 4 分配到默认应用程序池。

  1. 按 WINDOWS+R 打开“ 运行 ”对话框。

    (在Windows 8或更高版本中,在“开始”页上输入“运行”。在 Windows 7 中,从“开始”菜单中选择“运行”。如果“运行”不在“开始”菜单中,请右键单击任务栏,选择“属性”,选择“开始菜单”选项卡,选择“自定义”,然后选择“运行命令”。)

  2. 输入“inetmgr”,然后选择“ 确定”。

  3. “Connections”窗格中,展开服务器节点并选择“应用程序池”。 在“ 应用程序池 ”窗格中,如果 DefaultAppPool 已分配到 .NET Framework 版本 4,如下图所示,请跳到下一部分。

    Inetmgr_showing_4.0_app_pools

  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。

  5. 如果关闭 了 IIS 管理器,请再次运行它,展开服务器节点,然后选择“ 应用程序池”。

  6. 在“ 应用程序池 ”窗格中,选择“ DefaultAppPool”。 在“操作”窗格中,选择“基本设置”。

    Inetmgr_selecting_Basic_Settings_for_app_pool

  7. “编辑应用程序池 ”对话框中,将 .NET CLR 版本 更改为 .NET CLR v4.0.30319。 选择“确定” 。

    Selecting_.NET_4_for_DefaultAppPool

现在可以将 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 Edition

在SQL Server安装中心的第一页上,选择“新建SQL Server独立安装”或向现有安装添加功能,然后按照接受默认选项的说明进行操作。 在安装向导中,接受默认设置。 有关安装选项的详细信息,请参阅安装向导中的安装SQL Server (安装程序)

为测试环境创建SQL Server Express数据库

Contoso University 应用程序有两个数据库:

  1. 成员资格数据库
  2. 应用程序数据库

可以将这些数据库部署到两个单独的数据库或单个数据库。 将它们组合在一起可以更轻松地进行数据库联接。

如果要部署到第三方托管提供商,托管计划可能还会提供合并它们的理由。 例如,提供程序可能会对多个数据库收取更多费用,甚至可能不允许多个数据库。

在本教程中,你将部署到测试环境中的两个数据库,以及过渡和生产环境中的一个数据库。

在 Visual Studio 的“视图”菜单中,选择 Visual Web Developer) 中的“服务器资源管理器” (“数据库资源管理器”。 右键单击“数据Connections”,然后选择“新建SQL Server数据库”。

Selecting_Create_New_SQL_Server_Database

在“新建SQL Server数据库”对话框中,在“服务器名称”框中输入“.\SQLExpress”,在“新建数据库名称”框中输入“aspnet-ContosoUniversity”。 选择“确定” 。

创建 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 迁移部署期间运行脚本,这就是部署应用程序数据库的方式。 这意味着,在应用程序数据库中部署之前,必须手动运行脚本。

  1. 在 Visual Studio 中,打开前面创建的 Grant.sql 文件。

  2. 选择“连接”。

    “连接”按钮

  3. 在“ 连接到服务器 ”对话框中,输入 .\SQLExpress 作为 “服务器名称”。 选择“连接”。

  4. 在数据库下拉列表中,选择“ ContosoUniversity”。 选择“执行”。

    在数据库下拉列表中,选择“ContosoUniversity”。选择“执行”。

默认应用程序池标识现在在应用程序数据库中具有足够的权限,Code First 迁移在应用程序运行时创建数据库表。

发布到 IIS

可通过多种方式使用 Visual Studio 和 Web 部署部署到 IIS:

  • 使用 Visual Studio 一键式发布。
  • 从命令行发布。
  • 创建部署包并使用 IIS 管理器进行安装。 包包含一个 .zip 文件,其中包含在 IIS 中安装站点所需的所有文件和元数据。
  • 创建部署包并使用命令行进行安装。

在前面的教程中设置 Visual Studio 以自动执行部署任务的过程适用于所有这些方法。 在这些教程中,你将使用前两种方法。 有关使用部署包的信息,请参阅 通过在 Visual Studio 的 Web 部署内容映射中创建和安装 Web 部署包 来部署 Web 应用程序,并 ASP.NET。

在发布之前,请确保在管理员模式下运行 Visual Studio。 如果在标题栏中看不到 (管理员) ,请关闭 Visual Studio。 在Windows 8 (或更高版本) “开始”页或 Windows 7“开始”菜单中,右键单击 Visual Studio 图标并选择“以管理员身份运行”。 仅当发布到本地计算机上的 IIS 时,才需要管理员模式进行发布。

创建发布配置文件

  1. 解决方案资源管理器中,右键单击 ContosoUniversity 项目 (而不是 contosoUniversity.DAL 项目) 。 选择“发布”。 此时将显示 “发布 ”页。

  2. 选择“ 新建配置文件”。 将显示 “选取发布目标 ”对话框。

  3. 选择 IIS、FTP 等。选择“ 创建配置文件”。 将显示“发布”向导。

    “发布 Web”向导的“配置文件”选项卡

  4. “发布方法 ”下拉菜单中,选择“ Web 部署”。

  5. 对于 “服务器”,请输入 localhost

  6. 对于 “站点名称”,请输入 “默认网站/ContosoUniversity”。

  7. 对于 “目标 URL”,请输入 http://localhost/ContosoUniversity

    不需要 “目标 URL ”设置。 Visual Studio 完成应用程序部署后,会自动打开默认浏览器以访问此 URL。 如果不希望浏览器在部署后自动打开,请将此框留空。

  8. 选择“ 验证连接 ”以验证设置是否正确,并且可以连接到本地计算机上的 IIS。

    绿色检查标记验证连接是否成功。

    “发布 Web”向导的“连接”选项卡

  9. 选择“ 下一步 ”,转到 “设置” 选项卡。

  10. 配置” 下拉框指定要部署的生成配置。 将其设置为 默认值 Release。 在本教程中,不会部署调试版本。

  11. 展开 “文件发布选项”。 选择“ 从App_Data文件夹中排除文件”。

    在测试环境中,应用程序访问在本地SQL Server Express实例中创建的数据库,而不是App_Data文件夹中的.mdf文件。

  12. 清除“发布期间预编译”和“删除目标检查的其他文件”框。

    “设置”选项卡中的文件发布选项

    预编译是一种主要对大型网站有用的选项。 它可以减少网站发布后首次请求页面的启动时间。

    无需删除其他文件,因为这是你的第一个部署,并且目标文件夹中没有任何文件。

    注意

    如果选择“ 删除目标位置的其他文件 ”,以便后续部署到同一站点,请确保使用预览功能,以便在部署之前提前查看将删除的文件。 预期行为是 Web 部署将删除已在项目中删除的目标服务器上的文件。 但是,将比较源文件夹和目标文件夹下的整个文件夹结构;在某些情况下,Web 部署可能会删除你不想删除的文件。

    例如,如果将项目部署到根文件夹时,服务器上的子文件夹中有一个 Web 应用程序,该子文件夹将被删除。 你可能在 contoso.com 有一个项目用于 main 网站,在 contoso.com/blog 有另一个项目用于博客。 博客应用程序位于子文件夹中。 如果在部署main站点时选择“删除目标位置的其他文件”,则将删除博客应用程序。

    例如,App_Data文件夹可能会意外删除。 某些数据库(如 SQL Server Compact)将数据库文件存储在 App_Data 文件夹中。 初始部署后,不希望在后续部署中继续复制数据库文件,因此请在“包/发布 Web”选项卡上选择“ 排除App_Data ”。执行此操作后,如果选择了 “删除目标处的其他文件 ”,将在下次发布时删除数据库文件和App_Data文件夹本身。

配置成员资格数据库的部署

以下步骤适用于对话框的“数据库”部分中的 DefaultConnection数据库

  1. 在“远程连接字符串”框中,输入指向新SQL Server Express成员资格数据库的以下连接字符串。

    Data Source=.\SQLExpress;Initial Catalog=aspnet-ContosoUniversity;Integrated Security=True
    

    部署过程将此连接字符串放入已部署的 Web.config 文件中,因为选中了“在运行时使用此连接字符串”。

    还可以从服务器资源管理器获取连接字符串。 在“服务器资源管理器”中,展开“数据Connections并选择 <machinename>\sqlexpress.aspnet-ContosoUniversity 数据库,然后从”属性“窗口中复制”连接字符串“值。 该连接字符串将有一个可以删除的附加设置:Pooling=False

  2. 选择“ 更新数据库”。

    这会导致在部署期间在目标数据库中创建数据库架构。 在后续步骤中,指定需要运行的其他脚本:一个用于授予数据库对默认应用程序池的访问权限,另一个用于部署数据。

  3. 选择“ 配置数据库更新”。

  4. “配置数据库汇报”对话框中,选择“添加 SQL 脚本”。 导航到之前在解决方案文件夹中保存 的Grant.sql 脚本。

  5. 重复此过程以添加 aspnet-data-dev.sql 脚本。

    为成员身份数据库配置数据库汇报

  6. 选择“关闭”。

配置应用程序数据库的部署

当 Visual Studio 检测到 Entity Framework DbContext 类时,它会在“数据库”部分创建一个条目,其中包含“执行Code First 迁移检查”框,而不是“更新数据库检查”框。 在本教程中,你将使用该检查框来指定Code First 迁移部署。

在某些情况下,你可能正在使用数据库, DbContext 但希望使用 dbDacFx 提供程序而不是迁移来部署数据库。 在这种情况下,请参阅 MSDN 上的 ASP.NET Web 部署常见问题解答中的如何实现部署 Code First 数据库而不迁移?

以下步骤适用于对话框的“数据库”部分中的 SchoolContext数据库

  1. 在“远程连接字符串”框中,输入指向新SQL Server Express应用程序数据库的以下连接字符串。

    Data Source=.\SQLExpress;Initial Catalog=ContosoUniversity;Integrated Security=True
    

    部署过程将此连接字符串放入已部署的 Web.config 文件中,因为选中了“在运行时使用此连接字符串”。

    还可以采用与获取成员身份数据库连接字符串相同的方式从服务器资源管理器获取应用程序数据库连接字符串。

  2. 选择“在应用程序启动时执行Code First 迁移 (运行)

    此选项使部署过程将部署的 Web.config 文件配置为指定初始值设定项 MigrateDatabaseToLatestVersion 。 当应用程序在部署后首次访问数据库时,此初始值设定项会自动将数据库更新到最新版本。

配置发布配置文件转换

  1. 选择“关闭”。 当系统询问是否要保存更改时,请选择“ ”。

  2. 解决方案资源管理器中,依次展开“属性”和“发布”“配置文件”。

  3. 右键单击 CustomProfile.pubxml 并将其重命名为 Test.pubxml

  4. 右键单击“ Test.pubxml”。 选择“ 添加配置转换”。

    “添加配置转换”菜单

    Visual Studio 创建 Web.Test.config 转换文件并将其打开。

  5. Web.Test.config 转换文件中,紧接在打开的配置标记后面插入以下代码。

    <appSettings>
        <add key="Environment" value="Test" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
    </appSettings>
    

    使用测试发布配置文件时,此转换会将环境指示器设置为“测试”。 在部署的站点中,你将在“Contoso University”H1 标题后面看到“ (Test) ”。

  6. 保存并关闭该文件。

  7. 右键单击 Web.Test.config 文件,然后选择“ 预览转换 ”以确保编码的转换生成预期的更改。

    “Web.config 预览”窗口显示应用 Web.Release.config 转换和 Web.Test.config 转换的结果。

预览部署更新

  1. 再次打开 “发布 Web ”向导 (右键单击 ContosoUniversity 项目,选择“ 发布”,然后选择“ 预览) ”。

  2. 在“ 预览 ”对话框中,选择“ 开始预览 ”以查看要复制的文件的列表。

    发布预览

    还可以选择 “预览数据库 ”链接以查看将在成员资格数据库中运行的脚本。 (没有针对Code First 迁移部署运行脚本,因此应用程序 database.)

  3. 选择“发布”。

    如果 Visual Studio 不处于管理员模式,你可能会收到权限错误消息。 在这种情况下,请关闭 Visual Studio,在管理员模式下打开它,然后再次尝试发布。

    如果 Visual Studio 处于管理员模式,则 “输出 ”窗口将报告成功生成和发布。

    Output_window_publish_Test

    如果在“发布配置文件连接”选项卡上的“目标 URL”框中输入了 URL,浏览器会自动打开计算机上 IIS 中运行的 Contoso University 主页。

在测试环境中测试

请注意,环境指示器显示“ (测试) ”而不是“ (开发) ”,这表示环境指示器 的Web.config 转换成功。

运行“ 讲师 ”页,验证 Code First 是否已使用讲师数据设定数据库种子。 选择此页时,加载可能需要几分钟时间,因为 Code First 会创建数据库,然后运行 Seed 方法。 (当你在主页上时,它没有这样做,因为应用程序尚未尝试访问数据库。)

选择“ 学生 ”选项卡,验证部署的数据库是否没有学生。

“学生 ”菜单中选择“添加 学生 ”。 添加学生,然后在“学生”页中查看新 学生 。 这将验证是否可以成功写入数据库。

从“ 课程 ”菜单中,选择“ 更新额度”。 “ 更新额度 ”页需要管理员权限,因此会显示“ 登录 ”页。 输入之前创建的管理员帐户凭据 (“admin”和“devpwd”) 。 将显示 “更新额度 ”页。 这将验证在上一教程中创建的管理员帐户是否已正确部署到测试环境。

验证 c:\inetpub\wwwroot\ContosoUniversity 文件夹中是否存在 ELMAH 文件夹,其中仅包含占位符文件。

查看Code First 迁移的自动 Web.config 更改

C:\inetpub\wwwroot\ContosoUniversity 处打开已部署应用程序中的 Web.config 文件,可以看到部署过程配置的位置Code First 迁移将数据库自动更新到最新版本。

在 C:\inetpub\wwwroot\ContosoUniversity 处打开已部署应用程序中的 Web.config 文件,查看部署过程配置的位置,Code First 迁移将数据库自动更新到最新版本。

部署过程还创建了一个新的连接字符串,供Code First 迁移专门用于更新数据库架构:

Database_Publish 连接字符串

通过此附加连接字符串,可以指定一个用户帐户进行数据库架构更新,并为应用程序数据访问指定不同的用户帐户。 例如,可以将db_owner角色分配给Code First 迁移,并将db_datawriter角色db_datareader到应用程序。 这是一种常见的深层防御模式,可防止应用程序中潜在的恶意代码更改数据库架构。 (例如,在成功的 SQL 注入攻击中可能会发生这种情况。) 这些教程不使用此模式。 若要在方案中实现此模式,请执行以下步骤:

  1. “发布 Web”向导的“设置”选项卡下,输入指定具有完整数据库架构更新权限的用户连接字符串。 清除“在运行时使用此连接字符串检查框。 在部署的 Web.config 文件中,这将成为DatabasePublish连接字符串。

  2. 为希望应用程序在运行时使用的连接字符串创建 Web.config 文件转换。

总结

现已将应用程序部署到开发计算机上的 IIS,并在其中进行了测试。

测试中的主页

这将验证部署过程是否将应用程序的内容复制到正确的位置, (不包括不希望) 部署的文件,以及 Web 部署在部署期间是否正确配置了 IIS。 在下一教程中,你将再运行一个测试来查找尚未完成的部署任务:设置 Elm ah 文件夹的文件夹权限。

详细信息

有关在 Visual Studio 中运行 IIS 或IIS Express的信息,请参阅以下资源: