演练:使用 Web 部署包部署 Web 应用程序项目(第 1 部分,共 4 部分)
本演练是系列演练中的第一个演练,这些演练演示如何使用 Web 部署包部署 Web 应用程序项目。 在本系列中,您将创建一个文件系统 Web 应用程序项目。 您将首先将项目部署到本地计算机以进行本地 IIS 测试,然后将项目部署到临时服务器。 将配置用于部署到临时服务器的部署包,以便它还可用于部署到生产服务器。
本系列演练演示以下任务:
为“调试”生成配置创建包。
为“发布”生成配置创建包。
针对目标环境转换 Web.config 文件设置。
在部署过程中包含自定义 SQL 脚本。
重新部署已部署的数据库。
从部署中排除已部署的数据库。
将多个开发数据库部署到单个目标数据库。
使用和不使用在本地计算机上创建的帐户信息部署默认 ASP.NET 成员资格数据库。
对希望能在安装包时更改的配置值使用自定义部署参数。
使用 IIS 管理器在本地计算机上安装包。
使用 deploy.cmd 文件在远程计算机上安装包。
本演练阐释了以下任务:
为“调试”生成配置创建包。
针对目标环境转换 Web.config 文件设置。
将多个开发数据库部署到单个目标数据库。
在部署过程中包含自定义 SQL 脚本。
使用在本地计算机上创建的帐户信息部署默认 ASP.NET 成员资格数据库。
使用 IIS 管理器在本地计算机上安装包。
系统必备
为了完成本系列演练,您需要:
Visual Studio或 Visual Web Developer 速成版。
备注
如果使用 Visual Studio,则本演练假设您在首次启动 Visual Studio 时选择了“Web 开发”设置集合。有关更多信息,请参见如何:选择 Web 开发环境设置。
SQL Server Express 2008 或更高版本。 (默认情况下,这会随 Visual Studio 一起安装。)
AdventureWorksLT 数据库的 .mdf 文件版本。 可以在 CodePlex 网站上从 Microsoft SQL Server: Database Product Samples(Microsoft SQL Server:数据库产品示例)中将此文件作为 SQL2008.AdventureWorksLT2008_Only_Database.zip 进行下载。
在本地计算机上启用 IIS 7。
将 ASP.NET 4 注册到本地计算机上的 IIS 7,并将 ASP.NET 4 应用程序池分配给默认网站。 有关更多信息,请参见 ASP.NET IIS 注册工具 (Aspnet_regiis.exe)。
对本地计算机的管理权限。
此外,为了在第四个演练中完成部署包安装,您必须具有:
- 另一台您可以部署到的计算机。 另一台计算机也必须启用 IIS 7,ASP.NET 4 必须注册到 IIS 7,并且 ASP.NET 4 应用程序池必须指派给默认网站。 如果要设置此计算机,您需要对它具有管理权限。 如果其他人为您设置此计算机,则您可能需要对它具有管理权限,具体取决于使用的部署方法。 有关更多信息,请参见演练:使用 Web 部署包部署 Web 应用程序项目(第 4 部分,共 4 部分),此演练需要使用另一台计算机。
创建要部署的 Web 项目
在下面的过程中,您将使用 Visual Studio**“ASP.NET Web 应用程序”**项目模板创建要部署的 Web 应用程序项目。 您将创建 ASP.NET 默认成员资格数据库,添加 AdventureWorksLT 数据库,并添加用于显示 AdventureWorksLT 数据库中的数据的控件。
创建要部署的 Web 项目
在 Visual Studio 中,在**“文件”菜单上,单击“新建项目”**。
备注
请确保您选中了“新建项目”而非“新建网站”。部署打包只能用于 Web 应用程序项目。
将显示**“新建项目”**对话框。
在**“已安装的模板”窗口中,展开“Visual Basic”或“C#”,然后选择“Web”**。
选择**“ASP.NET Web 应用程序”**模板。
**“新建项目”**对话框与下图类似:
在**“名称”**框中,输入 AdventureWorks。
单击**“确定”**。
Visual Studio 将创建 Web 应用程序。 将创建 App_Data 文件夹以包含此应用程序的数据库,但该文件夹尚未包含任何数据库。
在**“解决方案资源管理器”中,展开 Account 文件夹,右击 Register.aspx 文件,然后单击“在浏览器中查看”**。
将显示**“创建新帐户”**页,如下图所示:
在**“用户名”中输入 newuser,在“密码”中输入 newuser,输入电子邮件地址,然后单击“创建用户”**。
将在 App_Data 文件夹中创建一个 ASPNETDB.MDF SQL Server 数据库文件,并将在其中输入您提供的凭据。 若要**“解决方案资源管理器”中查看 .mdf 文件,请单击“解决方案资源管理器”工具栏中的“显示所有文件”**按钮。
将 SQL2008.AdventureWorksLT2008_Only_Database.zip 文件的内容解压缩到项目的 App_Data 文件夹中。 有关此示例数据库的信息,请参见本主题前面的系统必备。
打开 Web.config 文件。
在 connectionStrings 元素中,为 AdventureWorksLT 数据库添加连接字符串,如以下示例所示:
<connectionStrings> <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" /> <add name="AWLTConnectionString" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\AdventureWorksLT2008_Data.mdf;User Instance=true" providerName="System.Data.SqlClient" /> </connectionStrings>
保存并关闭 Web.config 文件。
打开 Default.aspx 文件。
该文件在**“源”**视图中显示。
删除 h2 和 p 元素,然后在它们的位置添加以下标记:
<h2> Welcome to AdventureWorks! </h2> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:AWLTConnectionString %>" SelectCommand="SELECT SalesLT.Product.* FROM SalesLT.Product"> </asp:SqlDataSource> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="SqlDataSource1"> <Columns> <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" /> <asp:BoundField DataField="Color" HeaderText="Color" SortExpression="Color" /> <asp:BoundField DataField="ListPrice" HeaderText="ListPrice" SortExpression="ListPrice" /> <asp:BoundField DataField="Size" HeaderText="Size" SortExpression="Size" /> <asp:BoundField DataField="Weight" HeaderText="Weight" SortExpression="Weight" /> </Columns> </asp:GridView>
此标记将应用程序标题更改为**“Adventure Works”**,并添加 GridView 控件,以显示某个 AdventureWorksLT 表中的数据。 通过此控件,您可以验证是否已成功部署 AdventureWorks LT 数据。
保存并关闭 Default.aspx 文件。
(可选)按以下步骤更改母版页中的标题:
打开 Site.master 文件。
删除“My ASP.NET Application”(我的 ASP.NET 应用程序)并将它替换为“Adventure Works”。
保存并关闭文件。
按以下步骤测试站点:
按 Ctrl-F5 测试应用程序。
Default.aspx 页将显示在浏览器中。 该页显示 Adventure Works 产品列表,如下图所示:
单击**“登录”**超链接。
此时将显示**“登录”**页。
在**“用户名”和“密码”中输入 newuser,然后单击“登录”**。
此时将打开 Default.aspx 页,并在右上角显示**“欢迎您,newuser!”**,如下图所示:
关闭浏览器。
创建目标数据库
Web 项目当前具有两个数据库。 您需要将两个数据库的内容部署到单个数据库中。 在生产环境中,维护和管理一个数据库而不是两个可能更加经济高效。
在下面的过程中,将创建要部署到的空目标数据库。
创建目标数据库
在**“服务器资源管理器”中,右击“数据连接”,然后单击“创建新 SQL Server 数据库”**。
将显示**“创建新 SQL Server 数据库”**对话框。
在**“服务器名称”**框中,输入 localhost\SQLExpress。
在**“新数据库名称”**框中,输入 AdventureWorksTest。
输入数据库名称后,**“创建新 SQL Server 数据库”**对话框与下图类似:
单击**“确定”**。
将创建新数据库,并且新数据库会显示在**“服务器资源管理器”窗口的“数据链接”**文件夹中,如下图所示:
为目标数据库创建授权脚本
在 IIS 中部署 Web 应用程序时,会将它分配到默认 ASP.NET 4 应用程序池,并将使用应用程序池的凭据访问此数据库。 因此,您还必须创建一个用于向这些凭据授予读取权限的脚本。
在下面的过程中,将创建一个脚本,您将运行该脚本以便向应用程序池凭据授予数据库读取权限。
创建用于向应用程序池授予读取权限的脚本
打开文本编辑器,如“记事本”。
创建一个新的文本文件,并在其中插入以下 Transact-SQL 语句:
CREATE LOGIN [IIS APPPOOL\ASP.NET v4.0] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english] GO CREATE USER [AdventureWorksUser] FOR LOGIN [IIS APPPOOL\ASP.NET v4.0] GO EXEC sp_addrolemember 'db_datareader', 'AdventureWorksUser' GO
备注
此脚本适用于 Windows 7 和 Windows Server 2008 R2 中的默认安全设置。如果使用更早版本的 Windows 或者计算机采用自定义安全设置,此脚本可能造成网站在 IIS 中运行时所用的凭据对数据库无效。有关 SQL Server 安全性的更多信息,请参见 SQL Server 联机丛书。
将文件命名为 AdventureWorksGrant.sql 并将它保存到计算机上的文件夹中,如 C:\Temp。
您可以将该脚本保存在任何文件夹中。 在本演练中,稍后将访问该脚本,请记住这个位置。
设置活动生成配置
默认情况下,新项目的活动生成配置为“调试”。 将使用此生成配置在本地计算机上执行面向 IIS 的初始部署。 在下面的过程中,应确保选择了正确的生成配置。
设置活动生成配置
在**“生成”菜单中,单击“配置管理器”**。
将显示**“配置管理器”**对话框。
在**“活动解决方案配置”列表中,确保选中“调试”**。
**“活动解决方案配置”列表通常还显示在“常用”工具栏上。 如果此处显示该列表,无需打开“配置管理器”**就可以验证或更改生成配置。
关闭**“配置管理器”**。
指定部署打包设置
在下面的过程中,将指定应部署哪些文件和 IIS 设置,以及应如何创建包。
指定部署打包设置
在**“解决方案资源管理器”中右击该项目,再单击“属性”**。
将显示**“属性”**页。
选择**“打包/发布 Web”**选项卡。
将显示**“打包/发布 Web”**选项卡,如下图所示:
在**“配置”列表中,确保选中“活动(调试)”。 默认情况下,选择的是活动生成配置。 在上一过程中,已将活动生成配置设置为“调试”**。
在**“要部署的项(适用于所有部署方法)”列表中,确保选中“仅限运行此应用程序所需的文件”**复选框。
确保清除**“排除生成的调试符号”**复选框。
在演练的这一部分,您将配置面向计算机的部署以进行测试。 因此,您希望能够调试。
备注
是否能在调试模式下运行已部署站点取决于此选项和 Web.config 文件设置,而非生成配置的名称。
选中**“将文件从 App_Data 文件夹中排除”**复选框。
项目使用 App_Data 文件夹中的 SQL Server Express .mdf 文件,但是您将通过在空目标数据库中运行脚本来部署该文件。 因此,您将不会部署 .mdf 文件。
确保选中**“包括在‘打包/发布 SQL’选项卡中配置的所有数据库”复选框。 (您将在下面的过程中配置“打包/发布 SQL”**选项卡。)
确保选中**“以 zip 文件格式创建部署包”**复选框。
部署工具可以处理 .zip 文件格式的包。 如果清除此复选框,则包将作为文件夹结构中的文件创建。 创建已部署站点的存档副本时通常这样做。
确保**“创建包的位置”**框包含以下值(如果将 AdventureWorks 指定为项目名称,则此值为默认值):
obj\Debug\Package\AdventureWorks.zip
在**“要在目标服务器上使用的 IIS 网站/应用程序名称”**框中,输入“默认网站/AdventureWorks”。
保存对**“打包/发布 Web”**选项卡所做的更改。
指定数据库部署设置
在下面的过程中,将指定要部署的数据库以及如何部署数据库。 还将指定在部署过程中应运行在前面的过程中创建的 AdventureWorksGrant.sql 脚本。
指定将在部署过程中运行的 SQL Server 脚本
单击**“包”/“发布 SQL”**选项卡。
将显示**“打包/发布 SQL”**选项卡,如下图所示:
单击**“从 Web.config 导入”**。
Visual Studio 将读取应用程序 Web.config 文件以查找连接字符串。 对于 Web.config 文件中的每个连接字符串,Visual Studio 将在**“数据库项”网格中创建一行。 默认情况下,“数据库项”**网格中的名称是连接字符串名称加上 -Deployment 后缀。
对于本演练,将创建两行。 一个名为 ApplicationServices-Deployment,一个名为 AWLTConnectionString-Deployment,如下图所示:
确保选中**“数据库项”表中的“ApplicationServices-Deployment”**行。
**“数据库项”网格下方的字段将应用于“数据库项”**网格中的选定行。 如果未选中任何行,则将禁用表下方的字段。
在**“目标数据库的连接字符串”**框中,输入在前面的过程中创建的 AdventureWorksTest 数据库的连接字符串。 可以通过执行以下步骤实现这一目的:
在**“服务器资源管理器”**窗口中,展开“数据连接”文件夹,然后选择“AdventureWorksTest”数据库。
在**“属性”窗口中,选择“连接字符串”**属性的值,并复制该值。 **“属性”**窗口与下图类似:
将连接字符串粘贴到**“目标数据库的连接字符串”**框中。
确保选中**“从现有数据库中抽取数据和/或架构”**复选框。
单击**“从 Web.config 导入”**时,已自动选中此选项。 **“源数据库的连接字符串”**框也已使用 Web.config 文件中的连接字符串自动填充。
将**“数据库脚本选项”列表设置为“架构和数据”**。
部署后,目标数据库将包含创建项目时创建的用户帐户凭据。
在**“数据库项”表中,选择“AWLTConnectionString-Deployment”**行。
默认值显示在网格下方的字段中。
在**“目标数据库的连接字符串”**框中,输入为 ApplicationServices 数据库输入的相同目标连接字符串。
您对两个数据库使用了相同的目标连接字符串。 因此,在部署过程中,创建并填充数据库对象的脚本都在同一数据库中运行。 这样做的结果是目标数据库将包含两个项目数据库中的所有表和其他数据库对象。
确保选中**“从现有数据库中抽取数据和/或架构”**复选框。
将**“数据库脚本选项”列表设置为“架构和数据”**。
单击**“添加脚本”**。
在**“选择文件”对话框中,浏览到 C:\Temp\AdventureWorksGrant.sql,然后单击“打开”**。 (如果在本演练前面部分将脚本保存在其他文件夹中,请使用相应的文件夹名称。)
AdventureWorksGrant.sql 文件将添加到**“数据库脚本”**网格中,如下图所示:
保存对**“打包/发布 SQL”**选项卡所做的更改。
为自定义脚本指定事务模式
默认情况下,自动生成的脚本会在事务中运行。 但自定义脚本却不会。 如果混用事务模式,当脚本在部署过程中运行时,您可能会遇到超时错误。
在下面的过程中,将编辑项目文件以将在前面的过程中添加的自定义脚本配置为在事务中运行。
指定自定义脚本应在事务中运行
使用文本编辑器(如记事本)打开 AdventureWorks.csproj 或 AdventureWorks.vbproj 文件。
若要浏览到项目目录,请在**“解决方案资源管理器”中右击项目,然后单击“在 Windows 资源管理器中打开文件夹”**。
找到与“调试”生成配置相关的 PropertyGroup 元素。
该元素的开始标记类似于下面的示例:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
在 PropertyGroup 元素中,查找 PublishDatabaseSettings 元素。
在 PublishDatabaseSettings 元素中,查找名为 AWLTConnectionString-Deployment 的 ObjectGroup 元素。
此 ObjectGroup 元素中的第二个 Object 元素用于 AdventureWorksGrant.sql 脚本。
在用于 AdventureWorksGrant.sql 脚本的 Object 元素中,将 Source 元素的 Transacted 特性值更改为 True。
AWLTConnectionString-Deployment ObjectGroup 元素现在类似于下面的示例:
<ObjectGroup Name="AWLTConnectionString-Deployment" Order="2"> <Destination Path="..." /> <Object Type="dbFullSql" Enabled="True"> <PreSource Path="..." ScriptSchema="True" ScriptData="True" CopyAllFullTextCatalogs="False" ScriptDropsFirst="True" /> <Source Path="..." Transacted="True" /> </Object> <Object Type="dbFullSql" Enabled="False"> <Source Path="...\AdventureWorksGrant.sql" Transacted="True" /> </Object> </ObjectGroup>
保存更改并关闭项目文件。
当 Visual Studio 询问是否重新加载项目时,请单击**“重新加载”**按钮。
更改已部署的 Web.config 文件中的连接字符串
在下面的过程中,将创建一个转换文件,该文件可使已部署的 Web.config 文件中的数据库连接字符串设置为适用于目标环境的正确值。
更改已部署的 Web.config 文件中的连接字符串
在**“解决方案资源管理器”**中,展开 Web.config 文件。
如果名为 Web.Debug.config 的文件不存在,请右击该 Web.config 文件,然后单击**“添加配置转换”**。
打开 Web.Debug.config 文件。
删除包含 connectionStrings 元素的注释块,并将它替换为以下标记。 将 [连接字符串] 替换为在**“目标数据库的连接字符串”**框中输入的值。
<connectionStrings> <add name="ApplicationServices" connectionString="[connection string]" providerName="System.Data.SqlClient" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" /> <add name="AWLTConnectionString" connectionString="[connection string]" providerName="System.Data.SqlClient" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" /> </connectionStrings>
保存并关闭 Web.Debug.config 文件。
部署 Web 应用程序
下一步是通过创建包来部署项目。 然后可以使用 IIS 管理器将包导入 IIS。
创建一个包并将该包导入 IIS
在**“项目”菜单中,单击“生成部署包”**。
Visual Studio 生成项目,然后创建部署包,并在**“输出”窗口中显示日志。 在包创建过程中,Web 部署 dbFullSQL 提供程序会创建两个 SQL Server 脚本,每个源数据库一个。 因为只有一个目标数据库,所以导入包时这两个脚本都将在该数据库中运行。以下示例显示“输出”**窗口内容的各个部分。
------ 已启动生成: 项目: AdventureWorks,配置: 调试任意 CPU ------
...
------ 发布已启动: 项目: AdventureWorks,配置: 调试任意 CPU ------
已使用 Web.Debug.config 将 Web.config 转换到
obj\Debug\TransformWebConfig\transformed\Web.config。
...
正在将所有文件都复制到以下临时位置以进行打包/发布:
obj\Debug\Package\PackageTmp。
正在添加 MSDeploy.dbFullSql (MSDeploy.dbFullSql)。
...
正在添加子 sqlScript (MSDeploy.dbFullSql/
dbFullSql[@path='c:\users\username\documents\visual studio 2010\
Projects\AdventureWorks\AdventureWorksCS\obj\Debug\AutoScripts\
ApplicationServices-Deployment_SchemaAndData.sql']/sqlScript)。
...
正在添加声明的参数“IIS Web 应用程序名称”。
正在添加声明的参数“ApplicationServices-Deployment 连接字符串”。
正在添加声明的参数“AWLTConnectionString-Deployment 连接字符串”。
已成功在以下位置将包“{AdventureWorks.zip”
创建为单个文件:
file:///c:/users/username/documents/visual%20studio%202010/
Projects/AdventureWorks/AdventureWorksCS/obj/Debug/Package
...
========== 生成: 成功或最新 1 个,失败 0 个,跳过 0 个 ==========
========== 发布: 成功 1 个,失败 0 个,跳过 0 个 ==========
通过执行以下步骤,将部署包的路径复制到 Windows 剪贴板:
在**“解决方案资源管理器”中,如果未显示 obj 文件夹,请单击“解决方案资源管理器”工具栏中的“显示所有文件”**按钮。
依次展开 obj 文件夹、Debug 文件夹和 Package 文件夹。
选择 AdventureWorks.zip 文件。
在**“属性”窗口中,选择并复制“完整路径”**字段的值。
在 Windows“控制面板”中,单击**“管理工具”,然后单击“Internet 信息服务(IIS)管理器”**。
将打开 IIS 管理器,并且将在**“连接”**面板中选中您的计算机。
在**“连接”面板中,展开您的计算机节点,展开“网站”文件夹,然后选择“默认网站”**。
IIS 管理器现在与下图类似:
在**“操作”面板中,单击“导入应用程序”**。
备注
如果安装了 Web 部署(安装 Visual Studio 时会默认安装 Web 部署),则通常存在此链接。如果此链接缺失,请在“控制面板”中,打开“程序和功能”,右击“Web 部署工具”,然后单击“修复”。
**“导入应用程序包”向导将打开并显示“选择包”**对话框。
在**“包路径”**框中,粘贴在先前的步骤中复制的路径。
**“选择包”**对话框与下图类似:
单击**“下一步”**。
将显示**“选择包的内容”**对话框,如下图所示:
单击**“下一步”**。
将显示**“输入应用程序包信息”**对话框,如下图所示:
应用程序路径和连接字符串的默认值是在**“打包/发布 Web”**选项卡中设置的值。
单击**“下一步”**。
如果显示一个对话框,要求验证 ASP.NET 4 是否已安装在您的计算机上(如下图所示),请将 ASP.NET 4 应用程序池指派给默认网站。
为此,请执行以下步骤:
在**“输入应用程序包信息”对话框中,单击“取消”**。
在 Windows 的**“开始”菜单中,右击“命令提示符”,然后单击“以管理员身份运行”**。
浏览到 .NET Framework 4 的相应文件夹,如以下位置:
C:\Windows\Microsoft.NET\Framework\v4.0.30319
如果在您的计算机上 Windows 文件夹位于另一个驱动器上,请将 C 替换为相应的驱动器号。 对于 64 位操作系统,请使用 Framework64 而不是 Framework。
输入 aspnet_regiis -iru -enable 命令,然后按 Enter。
工具会将 ASP.NET 注册到 IIS。 有关更多信息,请参见 ASP.NET IIS 注册工具 (Aspnet_regiis.exe)。
关闭**“命令提示符”**窗口。
在 IIS 管理器中,选择**“默认网站”,然后在“操作”面板中单击“基本设置”**。
将**“应用程序池”更改为“ASP.NET v4.0”**应用程序池。 (完成演练后,可以将此选项重新设置为其原始值)。
重复前面的步骤,以安装包,可从 IIS 管理器的**“操作”面板上的“导入应用程序”**超链接开始。
在 Web 部署 安装包的过程中,会显示**“安装进度和摘要”**对话框。 该对话框在安装过程中显示一个进度条。 安装过程完成时,该对话框显示所执行操作的日志,如下图所示:
单击**“完成”**。
测试已部署的 Web 应用程序
本演练的最后一步是验证是否已正确部署 Web 应用程序。
测试 Web 应用程序
打开浏览器,并输入以下 URL:
https://localhost/AdventureWorks
将显示 Default.aspx 页。 它的外观与在 Visual Studio 中运行时的外观相同。 产品表证明已成功部署 AdventureWorksLT 数据库。
单击**“登录”**链接。
在**“用户名”和“密码”中都输入 newuser,然后单击“登录”**。
Default.aspx 页将再次显示,并且在**“注销”链接旁边显示“欢迎您,newuser!”**。 这证明已成功部署 ASP.NET 成员资格数据库。
后续步骤
在本演练中,您创建了一个包含两个数据库的文件系统 Web 应用程序项目。 将该项目部署为使用单个数据库的 IIS Web 应用程序。
本系列中的下一个演练是演练:使用 Web 部署包部署 Web 应用程序项目(第 2 部分,共 4 部分)。 在该演练中,将更改其中一个数据库的结构、更改网页,然后部署更改。