使用 Visual Studio ASP.NET Web 部署:部署到生产环境

作者 :Tom Dykstra

下载初学者项目

本教程系列介绍如何使用 Visual Studio 2012 或 Visual Studio 2010 将 (发布) ASP.NET Web 应用程序部署到Azure 应用服务 Web 应用或第三方托管提供程序。 有关该系列的信息,请参阅 系列中的第一个教程

概述

在本教程中,你将使用 Visual Studio 一键发布功能设置 Microsoft Azure 帐户、创建过渡环境和生产环境,并将 ASP.NET Web 应用程序部署到过渡和生产环境。

如果需要,可以部署到第三方托管提供程序。 本教程中所述的大多数过程对于托管提供程序或 Azure 都是相同的,只不过每个提供商都有自己的用于帐户和网站管理的用户界面。 可以在 Microsoft.com 网站上的 提供程序库中 找到托管提供程序。

提醒:如果在完成本教程时收到错误消息或某些内容不起作用,请务必检查本教程系列中的“故障排除”页。

获取 Microsoft Azure 帐户

如果还没有 Azure 帐户,只需几分钟即可创建一个免费试用版帐户。 有关详细信息,请参阅 Azure 免费试用

创建过渡环境

注意

由于编写了本教程,Azure 应用服务添加了一项新功能,以自动执行许多创建过渡和生产环境的过程。 请参阅在 Azure 应用服务 中为 Web 应用设置过渡环境

部署到测试环境教程中所述,最可靠的测试环境是托管提供程序中的网站,就像生产网站一样。 在许多托管提供商中,必须权衡其优势与大量额外费用,但在 Azure 中,可以创建额外的免费 Web 应用作为过渡应用。 你还需要一个数据库,而生产数据库费用的附加费用要么没有,要么很少。 在 Azure 中,需要为使用的数据库存储量付费,而不是为每个数据库付费,在过渡中使用的额外存储量将很少。

部署到测试环境教程中所述,在过渡和生产环境中,你将将两个数据库部署到一个数据库中。 如果要将它们分开,则过程将相同,只不过会为每个环境创建一个额外的数据库,并在创建发布配置文件时为每个数据库选择正确的目标字符串。

在本教程的这一部分中,你将创建一个用于过渡环境的 Web 应用和数据库,并在创建和部署到生产环境之前部署到过渡环境并对其进行测试。

注意

以下步骤演示如何使用 Azure 管理门户在 Azure 应用服务 中创建 Web 应用。 在最新版本的 Azure SDK 中,还可以使用服务器资源管理器在不离开 Visual Studio 的情况下执行此操作。 在Visual Studio 2013中,还可以直接从“发布”对话框创建 Web 应用。 有关详细信息,请参阅在 Azure 应用服务 中创建 ASP.NET Web 应用。

  1. Azure 管理门户中,单击“ 网站”,然后单击“ 新建”。

  2. 单击“ 网站”,然后单击“ 自定义创建”。

    此时会打开 “新建网站 - 自定义创建 ”向导。 使用 “自定义创建 ”向导可以同时创建网站和数据库。

  3. 在向导的 “创建网站” 步骤中,在 “URL ”框中输入一个字符串,用作应用程序暂存环境的唯一 URL。 例如,输入 ContosoUniversity-staging123 (末尾包含随机数,以便在 contosoUniversity-staging) 时使其唯一。

    完整的 URL 将包含你在此处输入的内容和你在文本框旁边看到的后缀。

  4. “区域 ”下拉列表中,选择离你最近的区域。

    此设置指定 Web 应用将在哪个数据中心运行。

  5. “数据库 ”下拉列表中,选择“ 创建新的 SQL 数据库”。

  6. 在“ 数据库连接字符串名称 ”框中,保留默认值 DefaultConnection

  7. 单击对话框底部的向右箭头。

    下图显示了“ 创建网站 ”对话框,其中包含示例值。 输入的 URL 和区域将不同。

    创建网站步骤

    该向导将转到 “指定数据库设置” 步骤。

  8. 在“ 名称 ”框中,输入 “ContosoUniversity” 加上一个随机数,使其唯一,例如 ContosoUniversity123

  9. 在“服务器”框中,选择“新建SQL 数据库服务器”。

  10. 输入管理员名称和密码。

    此处未输入现有名称和密码。 需要输入新的名称和密码,这些名称和密码需要现在定义,供以后访问数据库时使用。

  11. 在“ 区域 ”框中,选择为 Web 应用选择的同一区域。

    将 Web 服务器和数据库服务器保留在同一区域中可提供最佳性能并最大程度地减少费用。

  12. 单击框底部的检查标记以指示已完成。

    下图显示了“ 指定数据库设置 ”对话框,其中包含示例值。 输入的值可能不同。

    新建网站 - 使用数据库创建向导的数据库设置步骤

    管理门户返回到“网站”页,“ 状态” 列显示正在创建 Web 应用。 经过一段时间 (通常不到一分钟) , “状态” 列会显示已成功创建 Web 应用。 在左侧导航栏中,帐户中的 Web 应用数显示在 “网站 ”图标旁边,数据库数显示在 “SQL 数据库” 图标旁边。

    管理门户的网站页面,网站已创建

    Web 应用名称将不同于图中的示例应用。

将应用程序部署到过渡

现在,你已为过渡环境创建了一个 Web 应用和数据库,可以将项目部署到其中。

注意

这些说明演示如何通过下载 .publishsettings 文件来创建发布配置文件,该文件不仅适用于 Azure,也适用于第三方托管提供程序。 使用最新的 Azure SDK 还可以直接从 Visual Studio 连接到 Azure,并从 Azure 帐户中拥有的 Web 应用列表中进行选择。 在 Visual Studio 2013中,可以从“Web 发布”对话框或“服务器资源管理器”窗口登录到 Azure。 有关详细信息,请参阅在 Azure 应用服务 中创建 ASP.NET Web 应用

下载 .publishsettings 文件

  1. 单击刚创建的 Web 应用的名称。

    单击站点以转到仪表板

  2. “仪表板”选项卡的“快速概览”下,单击“下载发布配置文件”。

    下载发布配置文件链接

    此步骤下载一个文件,其中包含将应用程序部署到 Web 应用所需的所有设置。 您将此文件导入到 Visual Studio 中,这样您就不必手动输入此信息。

  3. .publishsettings 文件保存在可从 Visual Studio 访问的文件夹中。

    保存 .publishsettings 文件

    警告

    安全性 - .publishsettings 文件包含用于管理 Azure 订阅和服务 (未编码) 凭据。 确保此文件安全的最佳做法是,将其暂时存储在源目录的外部(例如存储在 Libraries\Documents 文件夹中),然后在完成导入后将其删除。 获取 .publishsettings 文件访问权限的恶意用户可以编辑、创建和删除 Azure 服务。

创建发布配置文件

  1. 在 Visual Studio 中,右键单击 解决方案资源管理器 中的 ContosoUniversity 项目,然后从上下文菜单中选择“发布”。

    “发布 Web”向导随即打开。

  2. 单击“配置文件”选项卡。

  3. 单击“导入”。

  4. 导航到之前下载的 .publishsettings 文件,然后单击“ 打开”。

    “导入发布设置”对话框

  5. 在“ 连接 ”选项卡中,单击“ 验证连接 ”以确保设置正确。

    验证连接后,“验证连接”按钮旁边会显示绿色检查标记。

    对于某些托管提供程序,单击“ 验证连接”时,可能会看到“ 证书错误 ”对话框。 如果这样做,请验证服务器名称是否为预期名称。 如果服务器名称正确,请选择“ 保存此证书以供将来的 Visual Studio 会话 使用”,然后单击“ 接受”。 (此错误意味着托管提供商已选择避免为要部署到的 URL 购买 SSL 证书的费用。如果希望使用有效的证书建立安全连接,请联系托管提供商。)

  6. 单击“下一步”。

    “连接”选项卡中的连接成功图标和“下一步”按钮

  7. “设置” 选项卡中,展开“ 文件发布选项”,然后 从“App_Data”文件夹中选择“排除文件”。

    有关 “文件发布选项”下的其他选项的信息,请参阅 部署到 IIS 教程。 显示此步骤的结果和以下数据库配置步骤的屏幕截图位于数据库配置步骤的末尾。

  8. 在“数据库”部分的“DefaultConnection下,为成员资格数据库配置数据库部署。

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

      DefaultConnection 正下方的“远程连接字符串”框已填充 .publishsettings 文件中的连接字符串。连接字符串包含SQL Server凭据,这些凭据以纯文本形式存储在 .pubxml 文件中。 如果不想将其永久存储在该处,可以在部署数据库后将其从发布配置文件中删除,并将它们存储在 Azure 中。 有关详细信息,请参阅 Scott Hanselman 博客上的 如何保护从源部署到 Azure 时 ASP.NET 数据库连接字符串的安全 。 2.单击“ 配置数据库更新”。 3. 在“配置数据库汇报”对话框中,单击“添加 SQL 脚本”。 4. 在 “添加 SQL 脚本 ”框中,导航到之前在解决方案文件夹中保存的 aspnet-data-prod.sql 脚本,然后单击“ 打开”。 5. 关闭“配置数据库汇报”对话框。

  9. 在“数据库”部分的“SchoolContext”下,选择“在应用程序启动) 时执行Code First 迁移 (运行

    Visual Studio 显示“执行Code First 迁移”,而不是“更新数据库”作为DbContext类。 如果要使用 dbDacFx 提供程序而不是迁移来部署使用DbContext类访问的数据库,请参阅 MSDN 上的 Visual Studio 的 Web 部署常见问题解答和 ASP.NET 中的如何实现部署 Code First 数据库而不迁移?

    设置” 选项卡现在如以下示例所示:

    用于暂存的“设置”选项卡

  10. 执行以下步骤保存配置文件并将其重命名为 “暂存”:

    1. 单击“ 配置文件 ”选项卡,然后单击“ 管理配置文件”。

    2. 导入创建了两个新配置文件,一个用于 FTP,一个用于 Web 部署。 配置了 Web 部署配置文件:将此配置文件重命名为 过渡

      将配置文件重命名为过渡

    3. 关闭 “编辑 Web 发布配置文件 ”对话框。

    4. 关闭 “发布 Web ”向导。

为环境指示器配置发布配置文件转换

注意

本部分介绍如何为环境指示器设置Web.config转换。 由于指示器位于 元素中<appSettings>,因此在部署到 Azure 应用服务 时,可以使用另一种方法来指定转换。 有关详细信息,请参阅 在 Azure 中指定Web.config设置

  1. 解决方案资源管理器中,展开“属性”,然后展开“PublishProfiles”。

  2. 右键单击 Staging.pubxml,然后单击“ 添加配置转换”。

    为过渡添加配置转换

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

  3. Web.Staging.config 转换文件中,紧接在开始 configuration 标记之后插入以下代码。

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

    使用暂存发布配置文件时,此转换会将环境指示器设置为“Prod”。 在部署的 Web 应用中,不会在“Contoso University”H1 标题后面看到任何后缀,如“ (Dev) ”或“ (Test) ”。

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

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

阻止公开使用测试应用

过渡应用的一个重要注意事项是它将在 Internet 上直播,但你不希望公众使用它。 若要最大程度地降低用户查找和使用它的可能性,可以使用以下一种或多种方法:

  • 设置防火墙规则,仅允许从用于测试暂存的 IP 地址访问过渡应用。
  • 使用无法猜到的模糊 URL。
  • 创建 robots.txt 文件,以确保搜索引擎不会对测试应用进行爬网,并在搜索结果中报告指向它的链接。

其中第一种方法是最有效的方法,但本教程中未介绍,因为它需要部署到 Azure 云服务,而不是Azure 应用服务。 有关 Azure 中的云服务和 IP 限制的详细信息,请参阅 Azure 提供的计算托管选项阻止特定 IP 地址访问 Web 角色。 如果要部署到第三方托管提供商,请与提供商联系,了解如何实现 IP 限制。

在本教程中,你将创建 一个robots.txt 文件。

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

  2. 创建名为 robots.txt的新文本文件,并在其中放置以下文本:

    User-agent: *
    Disallow: /
    

    User-agent 告知搜索引擎文件中的规则适用于所有搜索引擎 Web 爬网程序 (机器人) ,行 Disallow 指定不应爬网网站上的任何页面。

    你确实希望搜索引擎对生产应用进行目录,因此需要从生产部署中排除此文件。 为此,需要在创建生产发布配置文件时配置设置。

部署到过渡环境

  1. 右键单击 Contoso University 项目并单击“ 发布” ,打开“ 发布 Web”向导。

  2. 确保已选择 暂存 配置文件。

  3. 单击“发布” 。

    “输出”窗口会显示已执行的部署操作并报告部署的成功完成。 默认浏览器会自动打开已部署 Web 应用的 URL。

在过渡环境中测试

请注意, (H1 标题后没有“ (测试) ”或“ (Dev) ”,则环境指示器不存在,这表明环境指示器 Web.config 转换成功。

主页暂存

运行“ 学生 ”页,验证部署的数据库是否没有学生。

运行“ 讲师 ”页,验证 Code First 是否已使用讲师数据设定数据库种子:

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

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

请求无效 URL 以导致 ELMAH 将跟踪的错误,然后请求 ELMAH 错误报告。 如果要部署到第三方托管提供程序,你可能会发现报表为空,原因与上一教程中为空的原因相同。 必须使用托管提供商的帐户管理工具配置文件夹权限,以使 ELMAH 能够写入日志文件夹。

你创建的应用程序现在在 Web 应用中的云中运行,就像用于生产的应用一样。 由于一切正常,下一步是部署到生产环境。

部署到生产

创建生产 Web 应用并部署到生产环境的过程与过渡过程相同,只是需要从部署中排除 robots.txt 。 为此,你将编辑发布配置文件。

创建生产环境和生产发布配置文件

  1. 按照用于暂存的相同过程,在 Azure 中创建生产 Web 应用和数据库。

    创建数据库时,可以选择将其放在前面创建的同一服务器上,也可以创建新服务器。

  2. 下载 .publishsettings 文件。

  3. 按照用于暂存的相同过程,通过导入生产 .publishsettings 文件来创建发布配置文件。

    不要忘记在“设置”选项卡的“数据库”部分的 DefaultConnection 下配置数据部署脚本。

  4. 将发布配置文件重命名为 “生产”。

  5. 按照用于暂存的相同过程为环境指示器配置发布配置文件转换。

编辑 .pubxml 文件以排除robots.txt

发布配置文件名为 <profilename.pubxml>,位于 PublishProfiles 文件夹中。 PublishProfiles 文件夹位于 C# Web 应用程序项目中的 Properties 文件夹下、VB Web 应用程序项目中的“我的项目”文件夹下或 Web 应用项目中的 App_Data 文件夹下。 每个 .pubxml 文件都包含应用于一个发布配置文件的设置。 在“发布 Web”向导中输入的值存储在这些文件中,你可以对其进行编辑,以创建或更改 Visual Studio UI 中不可用的设置。

默认情况下,创建发布配置文件时,项目中会包含 .pubxml 文件,但你可以将其从项目中排除,Visual Studio 仍将使用它们。 Visual Studio 在 PublishProfiles 文件夹中查找 .pubxml 文件,无论它们是否包含在项目中。

每个 .pubxml 文件都有一个 .pubxml.user 文件。 如果选择了“保存密码”选项,则 .pubxml.user 文件将包含加密 的密码 ,并且默认情况下会将其从项目中排除。

.pubxml 文件包含与特定发布配置文件相关的设置。 如果要配置适用于所有配置文件的设置,可以创建 .wpp.targets 文件。 生成过程将这些文件导入 .csproj.vbproj 项目文件中,因此可以在项目文件中配置的大多数设置都可以在这些文件中配置。 有关 .pubxml 文件和 .wpp.targets 文件的详细信息,请参阅 How to: Edit Deployment Settings in Publish Profile (.pubxml) Files and the .wpp.targets File in Visual Studio Web Projects

  1. “解决方案资源管理器”中,依次展开“属性”和“PublishProfiles”。

  2. 右键单击 Production.pubxml ,然后单击“ 打开”。

    打开 .pubxml 文件

  3. 右键单击“ Production.pubxml ”,然后单击“ 打开”。

  4. 紧接在结束 PropertyGroup 元素之前添加以下行:

    <ExcludeFilesFromDeployment>
        robots.txt
    </ExcludeFilesFromDeployment>
    

    .pubxml 文件现在类似于以下示例:

    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <WebPublishMethod>MSDeploy</WebPublishMethod>
        <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
        <LastUsedPlatform>Any CPU</LastUsedPlatform>
        <SiteUrlToLaunchAfterPublish>http://contosou-staging.azurewebsites.net</SiteUrlToLaunchAfterPublish>
        <ExcludeApp_Data>True</ExcludeApp_Data>
        <MSDeployServiceURL>waws-prod-bay-001.publish.azurewebsites.windows.net:443</MSDeployServiceURL>
        <DeployIisAppPath>contosou-staging</DeployIisAppPath>
        <RemoteSitePhysicalPath />
        <SkipExtraFilesOnServer>True</SkipExtraFilesOnServer>
        <MSDeployPublishMethod>WMSVC</MSDeployPublishMethod>
        <UserName>[username]</UserName>
        <_SavePWD>True</_SavePWD>
        <PublishDatabaseSettings>
          <!-- database settings removed -->
        </PublishDatabaseSettings>
        <ExcludeFilesFromDeployment>
            robots.txt
        </ExcludeFilesFromDeployment>
      </PropertyGroup>
      <ItemGroup>
        <MSDeployParameterValue Include="$(DeployParameterPrefix)DefaultConnection-Web.config Connection String">
          <ParameterValue>Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User Id=CU-staging-admin@sk0264hvc9;Password=</ParameterValue>
        </MSDeployParameterValue>
        <MSDeployParameterValue Include="$(DeployParameterPrefix)SchoolContext-Web.config Connection String">
          <ParameterValue>Data Source=tcp:sk0264hvc9.database.windows.net,1433;Initial Catalog=ContosoUniversity-staging;User Id=CU-staging-admin@sk0264hvc9;Password=</ParameterValue>
        </MSDeployParameterValue>
      </ItemGroup>
    </Project>
    

    有关如何排除文件和文件夹的详细信息,请参阅 MSDN 上的 Visual Studio 和 ASP.NET Web 部署常见问题解答中的是否可从部署中排除特定文件或文件夹

部署到生产

  1. 打开“发布 Web”向导,确保选中“生产发布配置文件”,然后单击“预览”选项卡上的“开始预览”,验证不会将robots.txt文件复制到生产应用。

    要发布到生产环境的文件预览

    查看要复制的文件列表。 你将看到省略所有 .cs 文件,包括 .aspx.cs.aspx.designer.csMaster.csMaster.designer.cs 文件。 所有这些代码都已编译到 ContosoUniversity.dllContosoUniversity.pdb 文件中,你将在 bin 文件夹中找到这些文件。 由于运行应用程序只需要 .dll ,并且前面指定仅应部署运行应用程序所需的文件,因此不会将 .cs 文件复制到目标环境。 出于相同原因, 省略 obj 文件夹和 ContosoUniversity.csproj.csproj.user 文件。

    单击“ 发布 ”以部署到生产环境。

  2. 按照用于暂存的相同过程在生产环境中进行测试。

    除 URL 和缺少 robots.txt 文件外,所有内容都与暂存相同。

总结

现已成功部署和测试 Web 应用,可通过 Internet 公开使用。

主页生产

在下一教程中,你将更新应用程序代码并将更改部署到测试、过渡和生产环境。

注意

在生产环境中使用应用程序时,应实施恢复计划。 也就是说,应定期将数据库从生产应用备份到安全存储位置,并且应保留几代此类备份。 更新数据库时,应在更改前立即创建备份副本。 然后,如果犯了错误,直到将数据库部署到生产环境后才发现它,你仍然可以将数据库恢复到它损坏之前的状态。 有关详细信息,请参阅 Azure SQL 数据库备份和还原

注意

在本教程中,要部署到的 SQL Server 版本Azure SQL Database。 虽然部署过程类似于其他版本的 SQL Server,但在某些情况下,实际的生产应用程序可能需要用于Azure SQL数据库的特殊代码。 有关详细信息,请参阅使用Azure SQL数据库在SQL Server和Azure SQL数据库之间进行选择