演练:使用 Web 部署包部署 Web 应用程序项目(第 3 部分,共 4 部分)

本演练是系列演练中的第三个演练,这些演练演示如何使用 Web 部署包部署 Web 应用程序项目。 有关此系列演练的更多信息,请参见演练:使用 Web 部署包部署 Web 应用程序项目(第 1 部分,共 4 部分)

在本演练中,将创建一个用于将 Web 应用程序项目部署到临时环境的部署包。 创建包时所用的参数允许在安装时更改一些配置值。 这样,这个包也可部署到生产服务器。 本演练阐释了以下任务:

  • 将包创建为“发布”版本配置。

  • 针对目标环境转换 Web.config 文件设置。

  • 在部署过程中包含自定义 SQL 脚本。

  • 部署默认 ASP.NET 成员资格数据库,但不包含在本地计算机上创建的帐户信息。

  • 对于在安装包时希望能更改的配置值,使用自定义部署参数。

系统必备

有关系统必备组件的列表,请参见演练:使用 Web 部署包部署 Web 应用程序项目(第 1 部分,共 4 部分)

创建目标数据库

就像在前两个演练中的“调试”生成配置中所做的那样,将把 App_Data 文件夹中的两个数据库的内容都部署到一个数据库中。

如果是其他人设置目标环境,无论是谁,都必须为目标数据库提供连接字符串。 如果您自己创建目标数据库,可以像第一个演练一样,执行以下过程。

备注

只要可从目标服务器访问数据库,就可以在目标服务器或其他任何计算机上执行以下过程。如果在目标服务器之外的计算机上创建数据库,必须确保可通过远程连接访问该数据库。本演练不介绍如何实现这种方式。有关更多信息,请参见 SQL Server 联机丛书

创建目标数据库

  1. 在**“服务器资源管理器”中,右击“数据连接”,然后单击“创建新 SQL Server 数据库”**。

    此时会显示**“创建新 SQL Server 数据库”**对话框。

  2. 在**“服务器名称”**框中,输入 localhost\SQLExpress。

  3. 在**“新数据库名称”**框中,输入 AdventureWorksStaging。

  4. 单击**“确定”**。

设置活动生成配置

在本系列的前几个演练中,将部署设置配置为了“调试”生成配置。 不过,某些部署到临时服务器和生产服务器的部署设置,应该有所不同。 例如,.pdb 文件仅用于调试,通常不需要将 .pdb 文件部署到临时服务器或生产服务器。 因此,必须将新部署设置创建为“发布”生成配置。 该过程的第一步,是确保选择“发布”生成配置。

设置活动生成配置

  1. 在**“生成”菜单中,单击“配置管理器”**。

    将显示**“配置管理器”**对话框。

  2. 在**“活动解决方案配置”下拉列表中,选择“发布”**。

    **“活动解决方案配置”列表通常还显示在“标准”工具栏上。 如果此处显示该列表,无需打开“配置管理器”**就可以验证或更改生成配置。

  3. 关闭**“配置管理器”**。

指定部署打包设置

下一步,是指定应为“发布”配置部署哪些文件和 IIS 设置,以及应如何创建包。 在下面的过程中,将通过项目**“属性”页的“打包/发布 Web”**选项卡执行此操作。

为“发布”配置指定部署打包设置

  1. 在**“解决方案资源管理器”中右击项目名称,然后单击“属性”**。

  2. 选择**“打包/发布 Web”**选项卡。

  3. 在**“配置”下拉列表中,确保选中“活动(发布)”[Active (Release)]**。

  4. 在**“要部署的项(适用于所有部署方法)”下拉列表中,确保选中“仅限运行此应用程序所需的文件”**。

  5. 选中**“排除生成的调试符号”**复选框。

    您不准备在临时或生产环境中启用调试。 因此,不需要部署 .pdf 文件。

  6. 选中**“将文件从 App_Data 文件夹中排除”**复选框。

  7. 请确保已选中**“包括在‘打包/发布 SQL’选项卡中配置的所有数据库”**复选框。

  8. 请确保已选中**“以 zip 文件格式创建部署包”**复选框。

  9. 确保**“创建包的位置”**框包含以下值(如果将 AdventureWorks 指定为项目名称,则此值为默认值):

    obj\Release\Package\AdventureWorks.zip

  10. 在**“要在目标服务器上使用的 IIS 网站/应用程序名称”**框中,输入默认网站/AdventureWorks。

  11. 将更改保存到**“打包/发布 Web”**选项卡。

为成员资格数据库创建自定义脚本

向临时服务器和生产服务器进行部署的数据库部署设置与您为“调试”生成配置输入的设置相似。 区别在于您不需要部署输入到 ASP.NET 成员资格系统中的测试用户帐户。 但是,不能只为 ASP.NET 成员资格数据库指定**“仅限架构”**数据库部署。 这是因为数据库中的一个表包含 ASP.NET 成员资格系统所需的配置数据。 因此,您将创建一个自定义脚本来添加配置数据。

您将指定两个脚本将在部署时运行。 第一个脚本是自动为**“仅限架构”**设置生成的脚本。 第二个脚本是您的自定义脚本。

在下面的过程中,将创建一个自定义脚本,该脚本将配置数据插入已部署的 aspnet_SchemaVersions 表中。

创建自定义脚本以将数据插入已部署的 aspnet_SchemaVersions 表中

  1. 在命令提示符处,输入以下 Web 部署命令:

    "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:dbfullsql="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=[aspnetdb.mdf 的完整路径]\aspnetdb.mdf;User Instance=true" -dest:dbfullsql="c:\temp\aspnet_SchemaVersions.sql

    此 Web 部署命令将创建一个名为 aspnet_SchemaVersions.sql 的数据库脚本并将该脚本保存在 C:\Temp 文件夹中。 该脚本将创建成员资格数据库。

    您可以将该脚本保存在任何文件夹中。 在本演练中,稍后将访问该脚本,请记住这个位置。

    将 [aspnetdb.mdf 的完整路径] 替换为 aspnetdb.mdf 文件的实际路径。 如果 Program Files 文件夹位于另一个驱动器上,则替换为相应的驱动器号。 在**“解决方案资源管理器”中选择 aspnetmdb.mdf 时,可在“属性”窗口的“完整路径”**属性中查找 aspnetmdb.mdf 文件的路径。

  2. 在文本编辑器(如记事本)中打开 aspnet_SchemaVersions.sql,删除 aspnet_SchemaVersions 表中除 Insert 语句之外的所有内容。

    现在,aspnet_SchemaVersions.sql 文件类似于以下示例:

    INSERT [dbo].[aspnet_SchemaVersions] ([Feature], [CompatibleSchemaVersion], [IsCurrentVersion]) VALUES (N'common', N'1', 1)
    GO
    INSERT [dbo].[aspnet_SchemaVersions] ([Feature], [CompatibleSchemaVersion], [IsCurrentVersion]) VALUES (N'health monitoring', N'1', 1)
    GO
    INSERT [dbo].[aspnet_SchemaVersions] ([Feature], [CompatibleSchemaVersion], [IsCurrentVersion]) VALUES (N'membership', N'1', 1)
    GO
    INSERT [dbo].[aspnet_SchemaVersions] ([Feature], [CompatibleSchemaVersion], [IsCurrentVersion]) VALUES (N'personalization', N'1', 1)
    GO
    INSERT [dbo].[aspnet_SchemaVersions] ([Feature], [CompatibleSchemaVersion], [IsCurrentVersion]) VALUES (N'profile', N'1', 1)
    GO
    INSERT [dbo].[aspnet_SchemaVersions] ([Feature], [CompatibleSchemaVersion], [IsCurrentVersion]) VALUES (N'role manager', N'1', 1)
    GO
    
  3. 保存并关闭 aspnet_SchemaVersions.sql。

指定数据库部署设置

在下面的过程中,将指定要部署的数据库及其部署方式。 您还要添加在前面过程中创建的自定义脚本。

指定将在部署时运行的 SQL Server 脚本

  1. 单击**“包”/“发布 SQL”**选项卡。

  2. 单击**“从 Web.config 导入”**。

  3. 确保选中**“数据库项”网格中的“ApplicationServices-Deployment”**行。

  4. 在**“目标数据库的连接字符串”**框中,输入目标数据库的连接字符串。 如果要部署到上一步所创建的数据库,可执行以下步骤来完成此操作:

    1. 在**“服务器资源管理器”中,展开“数据连接”文件夹,然后选择“AdventureWorksStaging”**数据库。

    2. 在**“属性”窗口中,选择“连接字符串”**属性的值,将该值复制到 Windows 剪贴板。

    3. 在**“目标数据库的连接字符串”**框中,粘贴该连接字符串。

    4. 将连接字符串中的 localhost 更改为您的计算机的名称。

      因为要部署到远程计算机,所以必须进行此更改。 当部署脚本或应用程序在该计算机上运行时,localhost 不再表示您的计算机。

  5. 确保选中**“从现有数据库中抽取数据和/或架构”**复选框。

  6. 将**“数据库脚本选项”列表设置为“仅限架构”**。

  7. 添加之前创建的 aspnet_SchemaVersions.sql 脚本,步骤如下:

    1. 单击**“添加脚本”**按钮。

    2. 在**“选择文件”对话框中,浏览到 C:\Temp\aspnet_SchemaVersions.sql,然后单击“打开”**按钮。 (如果在本演练前面部分将脚本保存在其他文件夹中,请使用相应的文件夹名称。)

      aspnet_SchemaVersions.sql 文件脚本将添加到**“数据库脚本”**网格中。

  8. 在**“数据库项”表中,选择“AWLTConnectionString-Deployment”**行。

  9. 在**“目标数据库的连接字符串”**框中,输入前面为 ApplicationServices 数据库输入的连接字符串。

  10. 确保选中**“从现有数据库中抽取数据和/或架构”**复选框。

  11. 将**“数据库脚本选项”列表设置为“架构和数据”**。

  12. 添加向 IIS 应用程序池授予数据库读取权限的脚本,步骤如下:

    1. 如果要部署到您创建的数据库,请修改在本系列第一个演练中创建的 AdventureWorksGrant.sql 脚本。 移除 CREATE LOGIN SQL 命令。 如果要部署到其他人创建的数据库,创建者应提供脚本。

      因为登录是为服务器创建的,而不是为数据库创建的,所以必须移除 CREATE LOGIN 命令。

    2. 单击**“添加脚本”**按钮。

    3. 在**“选择文件”对话框中,浏览到要使用的脚本,然后单击“打开”**按钮。

      脚本将添加到**“数据库脚本”**网格中。

      备注

      此脚本适用于 Windows 7 和 Windows Server 2008 R2 中的默认安全设置。如果使用更早版本的 Windows 或者计算机采用自定义安全设置,此脚本可能造成网站在 IIS 中运行时所用的凭据对数据库无效。有关 SQL Server 安全性的更多信息,请参见 SQL Server 联机丛书

  13. 将更改保存到**“打包/发布 SQL”**选项卡。

为自定义脚本指定事务模式

在本系列第一个演练中,通过编辑项目文件指定了 AdventureWorksGrant.sql 脚本应在事务中运行。 这就配置了部署过程,因此所有脚本都将在相同的事务模式中运行。 因为已经为“发布”生成配置创建了新设置,所以必须为“发布”生成配置进行相同的更改。 此外,还必须为在本演练中添加的新自定义脚本 (aspnet_SchemaVersions.sql) 进行相同的更改。

在下面的过程中,将在项目文件中进行这两项更改。

指定自定义脚本应在事务中运行

  1. 在文本编辑器(如记事本)中打开 AdventureWorks.csproj 或 AdventureWorks.vbproj 文件。

    若要浏览到项目目录,请在**“解决方案资源管理器”中右击项目,然后单击“在 Windows 资源管理器中打开文件夹”**。

  2. 找到与“调试”生成配置相关的 PropertyGroup 元素。

    该元素的开始标记类似于下面的示例:

    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">

  3. 在 PropertyGroup 元素中查找 PublishDatabaseSettings 元素。

  4. 在 PublishDatabaseSettings 元素中,查找名为 ApplicationServices-Deployment 的 ObjectGroup 元素。

    此 ObjectGroup 元素中的第二个 Object 元素用于 aspnet_SchemaVersions.sql 脚本。

  5. 在用于 aspnet_SchemaVersions.sql 脚本的 Object 元素中,将 Source 元素的 Transacted 特性值更改为 True。

  6. 在 PublishDatabaseSettings 元素中,查找名为 AWLTConnectionString-Deployment 的 ObjectGroup 元素。

    此 ObjectGroup 元素中的第二个 Object 元素用于 AdventureWorksGrant.sql 脚本。

  7. 在用于 AdventureWorksGrant.sql 脚本的 Object 元素中,将 Source 元素的 Transacted 特性值更改为 True。

  8. 保存更改并关闭项目文件。

  9. 当 Visual Studio 询问是否重新加载项目时,请单击**“重新加载”**按钮。

  10. 在**“生成”菜单中,单击“清理 AdventureWorks”**。

配置 Web.config 文件转换

就像在本系列第一个演练中对“调试”生成配置所做的那样,必须确保所部署的 Web.config 文件中的连接字符串指向正确的数据库。 此外,在部署到临时服务器之前,需要在所部署的 Web.config 文件中进行以下更改:

  • 禁用调试。

  • 将最小密码长度增加为 8。

  • 设置 machineKey 值,以便站点在 Web 场环境中运行。 临时环境和生产环境中的 machineKey 值通常是不同的。 因此,为了在这两种环境中使用这个包,必须确保可以在安装时配置此值。

在下面的过程中,将为禁用调试的“发布”生成配置创建一个转换文件并增加密码长度。

为所部署的 Web.config 文件配置转换

  1. 在**“解决方案资源管理器”**中,展开 Web.config 文件节点。

  2. 打开 Web.Debug.config 文件。

  3. 将整个 connectionStrings 元素复制到 Windows 剪贴板。

  4. 关闭 Web.Debug.config。

  5. 打开 Web.Release.config 文件。

    请注意,不必为禁用调试执行任何操作。 默认的 Web.Release.config 文件已包含用于执行此操作的标记,如下例所示:

    <system.web>
      <compilation xdt:Transform="RemoveAttributes(debug)" />
      ...
    </system.web>
    
  6. 删除包含 connectionStrings 元素的注释块,将剪贴板的内容粘贴在此处。

  7. 在紧接 compilation 元素之后的位置添加以下标记:

    <machineKey 
       validationKey="staging" 
       decryptionKey="staging" 
       xdt:Transform="Insert" />
    
  8. 保存并关闭 Web.Release.config 文件。

创建部署参数

在下面的过程中,将创建一个部署参数,在生产服务器上安装包时,可使用此参数更改 machineKey 值。

创建 machineKey 值的部署参数

  1. 在**“解决方案资源管理器”中,右击项目,然后单击“添加新项”**。

  2. 在**“已安装的模板”面板中选择“C#”“Visual Basic”,然后选择“XML 文件”**模板。

  3. 在**“名称”框中,输入 Parameters.xml,然后单击“添加”**。

  4. 删除 <?xml version="1.0 encoding="utf-8" ?>,然后添加以下标记:

    <parameters>
      <parameter name="machineKey" 
        description="Please provide the machineKey value."
        defaultValue="staging"
        tags="">
        <parameterEntry kind="XmlFile"
          scope="obj\\Release\\Package\\PackageTmp\\Web\.config$"
          match="//machineKey[@validationKey]" />
        <parameterEntry kind="XmlFile"
          scope="obj\\Release\\Package\\PackageTmp\\Web\.config$"
          match="//machineKey[@decryptionKey]" />
      </parameter>
    </parameters>
    

    此标记将创建一个名为 machineKey 的参数。 如果使用 IIS 管理器安装所创建的包,description 特性值会显示为该框的标签,可以在其中输入 machineKey 值。

    parameterEntry 元素指定使用此参数值的位置。 kind 特性指定将在 XML 文件中插入该值。 scope 特性使用正则表达式指定要更新的 XML 文件。 (路径反映创建包时 Web.config 文件的路径,而不是该文件在所部署的 Web 应用程序中的路径。)match 特性使用 XPath 表达式选择要更新的特性,即 machineKey 元素的 validationKey 和 decryptionKey 特性。

创建包

在下面的过程中,将创建一个既可部署到临时服务器又可部署到生产服务器的包。

创建包

  • 在**“项目”菜单中,单击“生成部署包”**。

    Visual Studio 生成项目,然后创建部署包,并在**“输出”**窗口中显示日志。 在本系列最后一个演练中,将在远程服务器上安装此包。

后续步骤

在本系列前两个演练中,将一个文件系统 Web 应用程序项目部署到了 IIS Web 应用程序,以便在开发计算机上进行测试。 在本演练中,创建了一个可以用 Visual Studio 在创建包时生成的 deploy.cmd 文件部署到远程计算机的包。

本系列下一个也是最后一个演练是演练:使用 Web 部署包部署 Web 应用程序项目(第 4 部分,共 4 部分)。 在该演练中,将实际部署包。

请参见

概念

ASP.NET 部署内容映射