九、部署应用

有很多方法可以让您的 web 应用走向世界。 但是除了部署 web 项目,还有其他的考虑因素。 通常,您还会部署数据库,但不希望在生产环境中使用测试数据。 您应该维护单独的配置设置,以便您的项目能够指向每个环境中的正确数据库。

Visual Studio 和 ASP.NET Core 帮助您使用简单的技术和约定在不同的环境中维护项目文件和设置。 在微软 Azure 云平台的帮助下,您可以在几秒钟内轻松部署您的网站,并可根据需求进行缩放。

部署选项

本章将着重于部署你的 ASP.NET Core 应用到互联网信息服务(IIS)(微软的 web 服务器产品)和 Azure(微软的云服务)。 如果您计划部署到 Windows 以外的操作系统,请参考您特定操作系统的文档。 在继续部署之前,您应该熟悉环境配置设置。

环境配置

第 8 章身份验证、授权和安全中,我们快速了解了定义宿主环境的环境变量,例如,开发、登台或生产环境。 您可能还记得,在您的 web 项目的Properties面板的Debug选项卡中出现了一个环境变量列表。

打开launchSettings.json文件查看配置文件中的相同变量:

"environmentVariables": { 
  "ASPNETCORE_ENVIRONMENT": "Development" 
} 

您可能需要展开“解决方案资源管理器”面板中的Properties节点来找到launchSettings.json文件:

Environment configuration

Startup.cs文件的Configure()方法接受一个名为envIHostingEnvironment参数。 这可以用来检查环境类型,例如:

if (env.IsDevelopment()) { /* do something */ } 

有几个有用的属性和方法,包括以下:

  • env.EnvironmentName:用于获取或设置环境名称的读写属性
  • env.IsDevelopment():如果EnvironmentNameDevelopment则返回true
  • env.IsStaging():如果EnvironmentNameStaging则返回true
  • env.IsProduction():如果EnvironmentNameProduction则返回true
  • env.IsEnvironment(string environmentName):如果传入的参数environmentName匹配当前的EnvironmentName则返回true

在 Windows 上,env.EnvironmentName的值由ASPNETCORE_ENVIRONMENT变量设置。 在 Linux 或 OS X 上,环境设置会有所不同,因此请参考针对非 windows 部署的 ASP . net 文档,因为文档仍在发展中。 建议的值只是一种约定,但建议作为一个起点。

如果需要根据环境在 MVC 视图中显示不同的元素,可以使用环境标记助手,如下面的代码片段所示。 可以在一个逗号分隔的列表中使用多个环境名:

<environment names="Development"> 
    <p>For Development Only</p> 
</environment> 
<environment names="Staging,Production"> 
    <p>For Staging and Production Only</p> 
</environment> 

要在测试应用时模拟这些不同的环境,您可以在项目的PropertiesDebug选项卡中为每个环境创建不同的概要文件。 每次添加新的概要文件时,都可以添加相应的环境变量并分配适当的值。 相关配置文件将自动更新。 当您将应用部署到其他环境(如登台和生产环境)时,只需为特定的构建配置选择适当的概要文件。

为了帮助您的应用找到您的数据库,数据库连接字符串可以存储在您的appSettings.json文件中,位于您的 web 项目的根位置:

"ConnectionStrings": { 
  "DefaultConnection": "<full connection string goes here>" 
} 

在服务器环境中,您可以直接在服务器上定义环境变量。 在 Azure 托管的环境中,您可以通过Azure Portal设置环境变量。

部署你的 web 应用

部署 web 应用有几种方法。您可以简单地在解决方案资源管理器中右键单击 web 项目并选择Publish选项,如下面的截图所示。 这将为您呈现以下发布目标:

  • Microsoft Azure App Service:您可以部署到 Azure 上现有的 web 应用(以前称为Azure Website),也可以通过 Visual Studio 创建新的 web 应用。
  • Import:您可以导入Publish Profile来预填充标识目标位置的字段。 这可以来自主机提供商、网络管理员或开发团队。 它也可以从 Azure web 应用导出。
  • File System (under Custom):这个选项非常基本,但是提供了将已部署的应用直接导出到文件系统的选项。 您可以将导出的文件复制到您选择的目标目的地,或者压缩它们以将它们传输到其他地方。 Custom部分还提供了其他选项,如Web DeployWeb Deploy PackageFTP。 选择一个适合您需要的选项,并在必要时完成字段。
  • 其他托管选项:您可以访问网络托管选项的公共图库,您可以通过以下网址从托管合作伙伴中选择http://hosting.asp.net/hosting

Deploying your web app

部署数据库

SQL Server是许多 ASP 的常用选择.NET 开发人员,它与实体框架工作得很好。 将数据库部署到登台和生产环境有许多不同的方法。 对于一些开发人员,这个责任可能会移交给数据库管理员或系统管理员。

以下是一些你可以考虑的选择:

  • 编写 SQL 脚本在服务器上生成数据库对象
  • 使用实体框架迁移生成 SQL 脚本在服务器上运行
  • 使用实体框架迁移来生成数据库

您可能最终使用这些选项的组合,但最好的选项是您和您的团队能够达成一致的。 在某些情况下,您可能必须与数据库管理员、客户或 IT 经理讨论数据库创建方法。 您可能认为最好的选择是生成 SQL 脚本而不立即运行它们。 这将允许您在实际影响数据库之前检查脚本并在必要时进行修改。

根据您的场景,您可能必须通过代码或脚本自动插入种子数据。 理想情况下,应用代码应该准备好处理缺少数据的情况。

部署到 IIS

微软的 IIS web 服务器甚至早于活动服务器页面的第一个发布。 IIS 支持多种 web 框架和语言,包括 ASP。 净与 c#。 您可以在自己的 Windows 服务器或宿主环境中运行 IIS。

要部署到 IIS,您可以选择以下任一选项:

  • 将 web 应用文件直接复制到服务器上的 web 应用根目录
  • 使用 Visual Studio 前面提到的发布功能
  • 使用持续集成系统来自动化 web 部署

IIS 管理器界面如下所示:

Deploying to IIS

设置 IIS

在部署到 IIS 之前,必须确保在服务器上正确安装和配置了 IIS。 通常,一个网站将运行在端口80上用于 HTTP 访问,端口443用于 HTTPS 访问。 要启用安全套接字层(SSL),您还需要安装一个证书。

如果你不熟悉设置 IIS,请参考以下网址的官方教程:

http://www.iis.net/learn

设置 IIS 包括以下步骤:

  1. 在 Windows 的服务器管理器中启用Web 服务器(IIS)角色。
  2. 在 IIS 管理器中,设置一个 web 应用以在所需的端口上运行。
  3. 将应用池设置为No Managed Code.NET Core 管理自己的运行时。

您可能需要咨询您的管理员来在您的工作环境中设置 IIS。 如需更多信息,请在以下网址查阅官方文件:

https://docs.asp.net/en/latest/publishing/iis.html

使用文件系统

一旦 web 服务器被设置为运行 ASP.NET Core 应用,您可以从您的 web 应用直接复制文件到 web 服务器上的 web 根位置。 在 Visual Studio 中,您可以使用发布功能将文件导出到可以通过文件系统访问的文件夹。

要发布到文件系统,请遵循以下步骤:

  1. 在解决方案资源管理器中右键单击项目,然后单击发布
  2. Custom下选择File System选项。
  3. 命名你的出版简介。
  4. 选择目标位置,然后单击Next
  5. 预览连接信息,然后单击Next
  6. 根据需要更新设置和配置,然后单击Next
  7. 预览要发布的文件,然后单击发布

设置屏幕包括一个复选框,可以启用该复选框来删除目标位置中已经存在的其他文件。 如果文件列表在部署之间发生变化,这将非常有用。 请注意,无论您是部署到 Azure 还是部署到文件系统目的地,这个选项都存在,如下面的截图所示:

Using the filesystem

导入发布配置文件

为了导入发布配置文件,您将需要一个自己生成的发布配置文件,该文件来自团队成员或从网络主机获取。 然后您可以在发布对话框中选择导入选项。 如果你不确定如何生成自己的发布概要文件,按照说明在下一节中创建自己的 web 应用,然后浏览到 web 应用的叶片在 Azure 门户并单击发布概要文件按钮在 web 应用的工具栏。

要使用导入的发布配置文件发布,请遵循以下步骤:

  1. 在解决方案资源管理器中右键单击项目,然后单击发布
  2. 选择Import选项。
  3. 浏览到发布概要文件。
  4. 预览连接信息,然后单击Next
  5. 根据需要更新设置和配置,然后单击Next
  6. 预览要发布的文件,然后单击发布

部署到微软云平台 Azure

Azure 已成为全球许多开发人员的流行云平台,无论应用使用的是微软框架还是开源替代方案。 ASP。 对于 NET 开发者来说,Azure 是一个无需动脑筋的东西。 在免费计划下,你可以在 Azure 上创建最多 10 个免费网站,它为网络应用提供了一个野外生存的游乐场。

要开始使用 Azure,您可以在http://azure.com注册免费试用。

创建 web 应用

一旦你注册了 Azure,你就可以使用 Azure 门户创建一个 web 应用。 这个过程只需要几秒钟。 一旦启动,web 应用应该在一分钟内启动并运行。

要在 Azure 中创建一个 web 应用,请遵循以下步骤:

  1. 登录 Azure 门户网站http://portal.azure.com
  2. 点击左上方有加号的按钮。
  3. 从选项列表中选择Web + Mobile
  4. 从选项列表中选择Web App
  5. 填写所需信息,然后单击创建

允许 Azure 几秒钟来生成你的新 web 应用。一旦你的应用被创建,你应该被重定向到仪表板。 如果你把 web 应用仪表板,您应该看到一个瓷砖上更新你的状态你的 web 应用。一旦完成,你应该被重定向到设置叶片您刚才创建的 web 应用。

以下截图显示了创建Web App的过程:

Creating a web app

请注意,Azure UI 将随着时间的推移而不断发展,因此本章中的说明可能不能准确反映您在屏幕上看到的内容。 然而,基本的指令流可以用来近似地描述您需要做的事情。 有关最新的说明,请参阅以下网址所载的官方文件:

https://azure.microsoft.com/documentation

创建虚拟机

如果您需要完全控制一个虚拟机(VM),您也可以在 Azure 上创建一个 VM 来部署您的应用。 需要注意的是,一个虚拟机的成本通常比一个简单的 web 应用要高。它也需要花费更多的精力来创建和配置机器和 web 服务器。

要在 Azure 中创建虚拟机,请遵循以下步骤:

  1. 如果您还没有登录 Azure,请登录。
  2. 点击左上方有加号的按钮。
  3. 从选项列表中选择Virtual Machines
  4. 选择一个特色项目,例如:Windows Server 2012 R2 Datacenter
  5. 选择一个部署模型(如果可用),然后单击创建

尽管您可以选择经典部署模型,但建议您选择资源管理器选项作为您的部署模型。 这将允许您轻松地管理 Azure 中的相关资源以及 VM。

在出现的下一个刀片中,您必须输入关于 VM 的其他信息:

  • 基础:输入机器名和管理凭据,然后选择订阅、资源组和位置。 如果您还没有任何资源组,您可以在选择它之前创建一个新的资源组。
  • 大小:从多个预先配置的机器大小中选择一个。 您的选择将决定内核数量、RAM 数量、磁盘空间数量、自动伸缩能力和负载平衡特性。 请记住,创建具有更多特性和功能的 vm 的成本会更高。
  • 设置:选择存储帐户、虚拟网络、子网、公网 IP、默认安全组、诊断存储帐户(如果启用诊断)和可用性设置。 可用性集允许您将多个机器添加到同一个集合中,以避免所有机器同时关闭,这可以通过将 vm 放置在不同的物理服务器/机架上实现。

允许 Azure 大约 8 到 10 分钟来生成新的 VM。 虚拟机创建完成后,应该被重定向到仪表板,在那里应该会看到一个更新 VM 状态的平铺。 完成后,您应该被重定向到您刚刚创建的 VM 的设置刀片服务器。

在虚拟机的主刀片中,图标工具栏应该有一个Connect图标,允许您下载.rdp文件。 可以在 Windows(或其他操作系统)的远程桌面中打开该文件,直接与 VM 交互,就像您在 VM 面前一样。

如果要直接通过远程桌面连接到虚拟机,请使用以下格式的凭证:

  • 登录名:<machinename\username>
  • 登录密码:<password>

虚拟机创建过程如下所示:

Creating a virtual machine

一旦您访问了计算机,您将不得不手动设置 IIS 并在 Azure 中配置 VM 以启用所需的端口。 Azure 中的这些额外设置可以通过虚拟机关联的网络安全组访问。 如果无法找到,可单击左侧菜单中的所有资源,过滤所有资源列表,选择与虚拟机同名的网络安全组。 在此组的设置刀片中,您应该能够管理组的属性和入站/出站安全规则。 默认情况下,RDP 端口应该为您启用。

部署到 Azure

为了部署到 Azure,你可以手动部署你的 web 项目,或者通过持续集成设置自动部署。 Visual Studio 2015 使得将 web 应用部署到 Azure 中的 web 应用变得非常容易。

要从 Visual Studio 部署到 Azure,请遵循以下步骤:

  1. 在解决方案资源管理器中右键单击项目,然后单击发布
  2. 选择Microsoft Azure App Service选项。
  3. 如果您还没有登录 Azure,请登录。
  4. 选择一个Web App或新建一个 Web App。
  5. 如适用,请选择具体的“部署槽位”。
  6. 预览连接信息(如果适用),然后单击Next
  7. 根据需要更新设置和配置,然后单击Next
  8. 预览要发布的文件,点击发布,如下图所示:

Deploying to Azure

对于小型应用,这个过程通常需要几分钟,但发布时间可能会根据文件的数量和大小而有所不同。 一旦部署,你的网页浏览器应该弹出网站加载从你的网页应用在 Azure 上的 URL。 网站第一次加载时,应用第一次在 web 服务器上启动应该需要几秒钟。 随后的加载几乎是瞬间完成的。

如果你的网站在一段时间内没有访客,它就被认为是闲置的。 如果发生这种情况,web 应用将被 Azure 卸载,直到下一个访问者请求该站点。 第一个到达空闲站点的访问者将触发该站点再次加载,这将花费几秒钟。 虽然这有助于节省资源,但您可能希望始终保持 web 应用处于加载状态。 在 Azure 中的 web 应用的应用设置刀片中,您可以启用一个名为Always On的功能,以确保它总是加载。

持续集成

无论你从事一个项目单独或与一个团队的开发人员,你将最有可能使用 Git 源代码控制系统,如,Subversion,TFS。 为了帮助自动化部署过程,通过持续集成(CI)系统直接从源代码控制部署 web 应用是非常有效的。

**在实现 CI 时,有几个不同的选项可以考虑:

  • Team Foundation Server【T1
  • Visual Studio Team Services,微软的托管选项
  • 来自 JetBrains 的TeamCity【T1

要开始使用 TeamCity,你可以从这里下载:

https://www.jetbrains.com/teamcity

要开始使用 TFS,你可以从这里下载:

https://visualstudio.com/products/tfs-overview-vs.aspx

要开始使用 VSTS,你可以在这里注册:

https://visualstudio.com/products/visual-studio-team-services-vs.aspx

准备 CI

并不是团队中的每个人都准备好了进行 CI。 事实上,一些团队成员甚至项目经理可能会反对它。 讨论您的 CI 决策的利弊,并确保您有一个成功的策略来为您的项目实现 CI,这对您来说是很重要的。

考虑以下问题:

  • 我们没有时间讨论 CI:如果您听到此消息,那么您应该考虑一下在 IT 管理员休假的午夜将应用部署到登台服务器时所损失的时间。 从长远来看,自动化部署将使您节省更多时间。
  • We can’t afford to do CI:如果你听到这个抱怨,你应该考虑没有 CI 系统的成本。 除了执行部署之外,CI 系统还允许您运行单元测试。 您可能要花费大量的时间(甚至数天/周)来排除在修复 bug 或添加新特性时引入的复杂问题。 CI 系统将有助于及早发现这些问题,并在长期内节省时间。
  • We won't get buy in from our clients or upper management:如果你面临这种类型的恐惧,你应该说服你的团队与你的客户谈论 CI 的好处。 拥有一个合适的 CI 系统意味着关键的涉众将能够在任何时候访问 web 应用的实时版本,甚至是在开发迭代期间。 这将支持一个敏捷开发周期,它将鼓励早期反馈。

设置连续部署

使用 Azure 设置连续部署(CD)相当简单。 您可以从 Azure 门户的选项列表中进行选择。 一旦 CD 设置好,每次签入源代码控制系统都会触发到 Azure 的 web 部署。

要开始,完成以下步骤:

  1. 如果您还没有登录 Azure,请登录。
  2. 仪表板中选择您的 web 应用。
  3. 浏览您的 web 应用的设置。
  4. 设置刀片服务器中,查找部署选项来配置部署源。
  5. 在源列表中,选择一个源。

下面是一个你可能会在资料列表中看到的例子:

  • Visual Studio 在线
  • OneDrive
  • 本地 Git 存储库
  • GitHub
  • Bitbucket 都
  • Dropbox
  • 外部存储库(如 Git, Mercurial 等),如下截图所示:

Setting up Continuous Deployment

对于您所选择的选项,填写连接到相应服务的所需信息以建立连接。 一旦建立连接,您的凭据将用于未来的部署。 Azure 允许您为登台和生产环境设置部署槽,这些环境可以根据需要进行交换。 这将帮助您加快将最新的稳定构建引入生产环境的时间。

如果您有兴趣了解更多关于使用Visual Studio Team Services在云中运行单元测试的信息,请参阅官方文档:

https://www.visualstudio.com/docs/test/developer-testing/developer-testing

CI 的缺陷

现在您已经设置了 CD 和 CI,那么会出现什么问题呢? 多年的经验告诉许多开发人员要小心陷阱。 只要你知道将会发生什么,你就会准备好应对 CI 旅程中的挑战。

以下是你可能会遇到的挑战:

  • 学习曲线:如果您的团队是 CI 的新手,那么您的团队成员将会有一个学习曲线。 这是没有办法的。 尽一切努力让你的团队跟上进度。 放心吧,好处很快就会超过最初的障碍。
  • 前期成本:当你越过学习曲线时,你将面临一些前期成本,包括工作时间和可能的服务器费用。 再一次提醒自己,从长远来看,提前支付的额外费用会帮你省钱。
  • 误报:一旦一切都设置好了,一些单元测试可能会导致一些误报。 这可能是由编写糟糕的测试或一些不需要解决的模糊运行时场景引起的。
  • 错误的保证:您也可能有编写得很差的测试,导致错误的保证。 一个糟糕的测试可能表明一切正常,但忽略了等待某个用户在未来发现它的错误条件。
  • 长时间运行的部署:如果你有很多代码和大量的测试,你可能有长时间运行的部署。 关键在于重构代码库以减少不必要的代码,并优化单元测试以使其快速有效地运行。

一旦完成了初始设置并优化了代码和测试,您就可以顺利地进行部署过程了。 当您继续对代码和基础设施进行更改时,您可能偶尔需要与您的团队一起重新访问您的持续部署策略。 这将帮助你的团队提出任何需要解决的问题。

总结

在本章中,我们介绍了各种部署选项,并重点介绍了部署 ASP.NET web 应用到 Azure。 最后,我们简要介绍了 CI 和 CD。

展望未来,你应该继续关注微软的公告,以了解更多关于 ASP 的信息.NET Core 和 Azure。 有一些网站、博客和在线视频可能对你有用。

以下是你可能会觉得有用的在线资源列表: