ASP.NET Core(一)入门
本章涵盖
什么是ASP.NET Core?
您可以使用ASP.NET Core构建的内容
.NET Core的优缺点
ASP.NET Core的工作方式选择使用新框架进行学习和开发是一项巨大的投资,因此,必须尽早确定是否适合您。在本章中,我将提供一些有关ASP.NET Core的背景知识,它的含义,工作原理以及为什么在构建Web应用程序时应考虑使用它。
如果您不熟悉.NET开发,本文将帮助您了解.NET的情况。对于现有的.NET开发人员,我提供了有关现在是否是考虑将重点转移到.NET Core的恰当时机以及ASP.NET Core可以带来ASP.NET以前版本的优点的指南。
在本文的最后,您应该对.NET格局,.NET Core的角色以及ASP.NET Core的工作原理有一个很好的了解,因此,不费吹灰之力,让我们深入研究吧!
ASP.NET Core简介
ASP.NET Core是Microsoft广受欢迎的ASP.NET Web框架的最新版本,于2016年6月发布。ASP.NET的早期版本已进行了许多增量更新,着重于提高开发人员的生产率并优先考虑向后兼容性。 ASP.NET Core通过进行重大的体系结构更改来重新思考Web框架的设计和构建方式,从而扭转了这一趋势。
ASP.NET Core很大程度上归功于它的ASP.NET传统,并且许多功能都是以前继承的,但是ASP.NET Core是一个新框架。整个技术栈已被重写,包括Web框架和底层平台。
变化的核心是这样一种哲学:与其他现代框架相比,ASP.NET应该能够保持领先地位,但是现有的.NET开发人员应该继续保持熟悉的感觉。在本节中,我将介绍
使用Web框架的原因
以前的ASP.NET框架的优点和局限性
什么是ASP.NET Core及其动机
在本节的最后,您应该对为什么创建ASP.NET Core,其设计目标以及为什么要使用它有一个很好的了解。
使用Web框架
如果您是Web开发的新手,那么进入一个如此流行的词汇和大量不断变化的产品领域可能会令人生畏。您可能想知道它们是否全部必要-从服务器返回文件有多困难?
那么,完全可以在不使用Web框架的情况下构建静态Web应用程序,但是其功能将受到限制。一旦想要提供任何安全性或动态性,您可能会遇到困难,而引诱您的原始简单性将在您眼前消失!
就像您可能使用桌面或移动开发框架来构建本机应用程序一样,ASP.NET Core使编写Web应用程序比尝试从头开始构建所有内容更快,更轻松,更安全。它包含用于常见事物的库,例如
创建动态更改的网页
让用户登录到您的Web应用
允许用户使用其Facebook帐户登录到您的网站
提供通用的结构来构建可维护的应用程序
读取配置文件
提供图片文件
将Log保存到您的Web应用程序
任何现代Web应用程序的关键是生成动态Web页面的能力。例如,动态网页根据当前登录的用户显示不同的数据,或者可以显示用户提交的内容。没有动态框架,就无法登录网站或在页面上显示任何类型的个性化数据。简而言之,不可能有Amazon,eBay和Stack Overflow之类的网站(如图1.1所示)。
图1.1 Stack Overflow网站(https://*.com)是使用ASP.NET构建的,几乎完全是动态内容。
A screenshot of a map Description automatically generated
ASP.NET的优点和局限性
要了解Microsoft为什么决定建立新框架,重要的是要了解以前的ASP.NET Web框架的优点和局限性。
ASP.NET的第一个版本于2002年作为.NET Framework 1.0的一部分发布,以响应当时经典的ASP和PHP的常规脚本环境。 ASP.NET Web窗体允许开发人员使用图形设计器和一个简单的事件模型来快速创建Web应用程序,该模型反映了桌面应用程序构建技术。
ASP.NET框架允许开发人员快速创建新的应用程序,但是随着时间的流逝,Web开发生态系统发生了变化。很明显,ASP.NET Web窗体存在许多问题,尤其是在构建大型应用程序时。特别是,由于缺乏可测试性,复杂的状态模型以及对生成的HTML的影响有限(使客户端开发变得困难),导致开发人员不得不评估其他选项。
作为响应,Microsoft在2009年基于Model-View-Controller模式发布了ASP.NET MVC的第一个版本,该模式是Ruby on Rails,Django和Java Spring等其他框架中使用的通用Web设计模式。该框架使您可以将UI元素与应用程序逻辑分离,使测试更加容易,并提供对HTML生成过程的更严格控制。
自从第一次发布以来,ASP.NET MVC已经经历了四次迭代,但是它们都基于System.Web.dll文件提供的相同基础框架构建。该库是.NET Framework的一部分,因此它已随Windows的所有版本预先安装。它包含构建Web应用程序时ASP.NET使用的所有核心代码。
这种依赖性带来了优点和缺点。一方面,ASP.NET框架是一个经过实践检验的可靠平台,非常适合在Windows上构建Web应用程序。它提供了广泛的功能,这些功能已投入生产多年,并且几乎所有Windows Web开发人员都众所周知。
另一方面,这种依赖是有限的,对基础System.Web.dll的更改影响深远,因此推出速度很慢。这限制了ASP.NET可以*发展的程度,并且导致发布周期仅每隔几年发生一次。 Windows Web主机Internet Information Service(IIS)也有明确的结合,因此无法在非Windows平台上使用。
Note
最近,Microsoft宣布“完成” .NET Framework。它不会被移除或替换,但也不会获得任何新功能。因此,基于System.Web.dll的ASP.NET也不会接收新功能或更新。
近年来,许多Web开发人员已经开始研究可以在Windows以及Linux和macOS上运行的跨平台Web框架。微软认为现在是时候创建一个不再与其Windows版本相关的框架了,因此ASP.NET Core诞生了。
什么是ASP.NET Core?
创建具有四个主要目标的Web框架的愿望推动了ASP.NET Core的发展:
可以跨平台运行和开发
具有模块化体系结构,易于维护
完全作为开源软件开发
适用于Web开发的当前趋势,例如客户端应用程序和部署到云环境
为了实现所有这些目标,Microsoft需要一个平台,该平台可以提供用于创建列表和字典等基本对象以及执行例如简单文件操作的基础库。到目前为止,ASP.NET开发始终集中于并且依赖于仅Windows的.NET Framework。对于ASP.NET Core,Microsoft创建了一个轻量级平台,可在Windows,Linux和macOS上运行,称为.NET Core(随后称为.NET 5),如图1.2所示。
定义
.NET 5是3.1之后的下一个.NET Core版本。它表示将.NET Core和其他.NET平台统一到一个运行时和框架中。术语.NET Core和.NET 5通常可以互换使用,但是为了保持一致性,我在本书中始终使用术语.NET Core。
.NET Core与.NET Framework共享许多相同的API,但是它更具模块化,并且仅实现.NET Framework提供的功能的子集,目的是提供更简单的实现和编程模型。它是一个完全独立的平台,而不是.NET Framework的分支,尽管它的许多API使用类似的代码。
仅使用.NET Core,就可以构建可跨平台运行的控制台应用程序。 Microsoft创建了ASP.NET Core,作为控制台应用程序之上的附加层,因此,转换为Web应用程序需要添加和编写库,如图1.3所示。
1.3 ASP.NET Core应用程序模型。 .NET Core平台提供了用于运行命令行应用程序的基本控制台应用程序模型。添加Web服务器库会将其转换为ASP.NET Core Web应用程序。其他功能(如配置和日志记录)通过其他库添加。
图1.2 ASP.NET Core,ASP.NET,.NET Core和.NET Framework之间的关系。 ASP.NET Core在.NET Core上运行,因此可以跨平台运行。相反,ASP.NET仅在.NET Framework上运行,因此与Windows OS绑定在一起。
通过将ASP.NET Core Web服务器添加到.NET Core应用程序,您的应用程序可以作为Web应用程序运行。 ASP.NET Core由许多小型库组成,您可以选择这些小型库来为您的应用程序提供不同的功能。您几乎不需要所有可用的库,只需添加所需的库即可。一些库是通用的,并且实际上会出现在您创建的每个应用程序中,例如用于读取配置文件或执行日志记录的库。其他库基于这些基本功能来提供特定于应用程序的功能,例如通过Facebook或Google进行第三方登录。
您将在ASP.NET Core中使用的大多数库都可以在GitHub上的GitHub上找到,该库位于Microsoft ASP.NET Core组织存储库中,网址为https://github.com/aspnet。您可以在此处找到核心库,例如身份验证和日志记录库,以及更多外围设备库,例如第三方身份验证库。
正如公共库所建议的那样,所有ASP.NET Core应用程序都将遵循类似的基本配置设计,但是总体而言,该框架是灵活的,因此您可以*创建自己的代码约定。这些通用库,基于它们的扩展库以及它们促进的设计约定构成了有点晦涩的术语ASP.NET Core。
何时选择ASP.NET Core
希望您现在对ASP.NET Core是什么以及它的设计有了一个大致的了解。但是问题仍然存在:您应该使用它吗? Microsoft建议所有新的.NET Web开发都应使用ASP.NET Core,但是对于任何开发人员或公司来说,切换到新的Web堆栈或学习新的Web堆栈都是一个很大的要求。在本节中,我将介绍
您可以使用ASP.NET Core构建什么样的应用程序
ASP.NET Core的一些亮点
为什么应考虑将ASP.NET Core用于新应用程序
将现有的ASP.NET应用程序转换为ASP.NET Core之前需要考虑的事项
您可以构建哪种类型的应用程序?
ASP.NET Core提供了可用于各种应用程序的通用Web框架。很明显,它可以用于构建丰富,动态的网站,无论是电子商务网站,基于内容的网站还是大型的n层应用程序-与ASP.NET的早期版本几乎相同。
最初发布.NET Core时,很少有第三方库可用于构建这些类型的复杂应用程序。经过几年的积极发展,情况已不再如此。许多开发人员已更新其库以与ASP.NET Core一起使用,并且创建了许多其他库以专门针对ASP.NET Core。例如,开源内容管理系统(CMS)Orchard [1]已重新开发为Orchard Core [2],可以在ASP.NET Core上运行。相比之下,cloudscribe [3] CMS项目(图1.4)从一开始就专门为ASP.NET Core编写。
图1.4 .NET Foundation网站(https://dotnetfoundation.org/)是使用cloudscribe CMS和ASP.NET Core构建的。
传统的基于页面的服务器端呈现的Web应用程序是ASP.NET开发的生死攸关,无论是以前版本的ASP.NET还是ASP.NET Core。此外,使用ASP.NET Core可以轻松创建单页应用程序(SPA),该应用程序使用通常与REST服务器通信的客户端框架。无论您使用的是Angular,Vue,React还是其他客户端框架,都可以轻松创建一个ASP.NET Core应用程序作为服务器端API。
定义
REST代表代表性状态转移。 RESTful应用程序通常使用轻量级和无状态的HTTP调用来读取,发布(创建/更新)和删除数据。
ASP.NET Core不仅限于创建RESTful服务。根据您的要求,很容易为您的应用程序创建Web服务或远程过程调用(RPC)样式的服务,如图1.5所示。在最简单的情况下,您的应用程序可能只公开一个端点,从而将其范围缩小为微服务。凭借其跨平台支持和轻量级设计,ASP.NET Core非常适合构建简单服务。
图1.5 ASP.NET Core可以充当各种不同客户端的服务器端应用程序:它可以为传统的Web应用程序提供HTML页面,可以充当客户端SPA应用程序的REST API,或者可以充当客户端应用程序的即席RPC服务。
选择平台时,应考虑多个因素,但并非所有因素都是技术因素。其中一个因素是您可以期望其创建者提供的支持水平。对于某些组织来说,这可能是采用开源软件的主要障碍之一。幸运的是,Microsoft承诺[4]自发布之日起至少三年内,将对.NET Core和ASP.NET Core的长期支持(LTS)版本提供全面支持。而且,由于所有开发都是公开进行的,因此有时您可以从一般社区以及直接从Microsoft获得问题的答案。
在决定是否使用ASP.NET Core时,需要考虑两个主要方面:是否已经是.NET开发人员,以及是否要创建新应用程序或希望转换现有应用程序。
如果您是.NET开发的新手
如果您是.NET开发的新手,并且正在考虑使用ASP.NET Core,那么欢迎您!微软正在将ASP.NET Core推向Web开发初学者的有吸引力的选择,但是采用.NET跨平台意味着它与自己的地盘上的许多其他框架竞争。与其他跨平台Web框架相比,ASP.NET Core具有许多卖点:
这是一个现代的,高性能的开源网络框架.
它使用熟悉的设计模式和范例。
C#是一种很棒的语言(或者,您也可以使用VB.NET或F#)。
您可以在任何平台上构建和运行。
ASP.NET Core是对ASP.NET框架的重新构想,它是在新的.NET Core平台之上以现代软件设计原则构建的。尽管从某种意义上来说是新的,但是.NET Core已有数年的广泛生产使用,并且从成熟,稳定和可靠的.NET Framework中获得了极大的借鉴,该框架已经使用了十多年。您可以放心,选择ASP.NET Core和.NET Core,您将获得可靠的平台以及功能全面的网络框架。
当今可用的许多Web框架都使用类似的,完善的设计模式,而ASP.NET Core也不例外。例如,Ruby on Rails因其使用Model-View-Controller(MVC)模式而闻名。 Node.js以使用小型离散模块(称为管道)处理请求的方式而闻名。依赖注入可以在各种各样的框架中找到。如果您熟悉这些技术,则应该容易地将它们跨平台传输到ASP.NET Core。如果您不熟悉它们,那么您可以期待使用行业最佳实践!
.NET开发(尤其是ASP.NET Core)的主要语言是C#。这种语言有大量的追随者,这是有充分理由的!作为一种基于C的面向对象的语言,它为使用C,Java和许多其他语言的用户提供了熟悉的感觉。此外,它还具有许多强大的功能,例如语言集成查询(LINQ),闭包和异步编程构造。 C#语言也在GitHub上公开设计,微软的C#编译器Roslyn也是如此。[5]
ASP.NET Core和.NET Core的主要卖点之一是能够在任何平台上开发和运行的能力。无论您使用的是Mac,Windows还是Linux,都可以运行相同的ASP.NET Core应用并在多个环境中进行开发。作为Linux用户,支持广泛的发行版(仅举几例,包括RHEL,Ubuntu,Debian,Cent-OS,Fedora和openSUSE),因此您可以确信选择的操作系统将是一个可行的选择。 ASP.NET Core甚至可以在很小的Alpine发行版上运行,以真正紧凑地部署到容器。
考虑到容器的构建
传统上,Web应用程序直接部署到服务器,或者最近部署到虚拟机。虚拟机允许将操作系统安装在虚拟硬件层中,从而抽象出基础硬件。与直接安装相比,它具有多个优点,例如易于维护,部署和恢复。不幸的是,它们在文件大小和资源使用方面也很繁重。
这就是容器的来源。容器的重量更轻,并且没有虚拟机的开销。它们由多层构成,不需要您在启动新操作系统时启动新操作系统。这意味着它们可以快速启动,非常适合快速配置。容器,尤其是Docker,正迅速成为构建大型可扩展系统的首选平台。
容器从来都不是ASP.NET应用程序特别吸引人的选择,但是随着ASP.NET Core,.NET Core和Windows Docker的出现,这一切都在变化。在跨平台的.NET Core框架上运行的轻量级ASP.NET Core应用程序非常适合瘦容器部署。
与在每个平台上运行一样,.NET的卖点之一是仅能编写和编译一次的能力。您的应用程序被编译为中间语言(IL)代码,该代码是独立于平台的格式。如果目标系统已安装.NET Core平台,则可以从任何平台运行已编译的IL。这意味着,例如,您可以在Mac或Windows计算机上进行开发,然后将完全相同的文件部署到生产Linux计算机上。 ASP.NET Core和.NET Core终于实现了一次编译,无处不在的承诺。
如果您是.NET Framework开发人员,请创建新的应用程序
如果您是.NET开发人员,那么是否为新应用程序购买ASP.NET Core的选择很大程度上是时间问题。早期版本的.NET Core缺少某些功能使其难以采用。随着.NET Core 3.1和.NET 5的发布,这不再是问题; Microsoft现在明确建议所有新的.NET应用程序都应使用.NET Core。微软已承诺为旧版ASP.NET框架提供错误和安全修复程序,但不会再有任何功能更新。 .NET Framework不会被删除,因此您的旧应用程序将继续运行,但您不应将其用于新开发。
与以前的ASP.NET框架相比,ASP.NET Core的主要优点是:
跨平台开发与部署
以性能为特色
简化的托管模式
定期发布,发布周期更短
开源的
模块化功能
作为.NET开发人员,如果您不使用特定于Windows的特定结构(例如注册表),那么跨平台构建和部署应用程序的能力将为全新的应用程序之路打开大门:利用便宜的Linux托管在云中的VM,使用Docker容器进行可重复的持续集成或在Mac上编写.NET代码而无需运行Windows虚拟机。 ASP.NET Core与.NET Core的结合使所有这些成为可能。
.NET Core本质上是跨平台的,但是如果需要,您仍然可以使用特定于平台的功能。例如,可以使用兼容包[6]启用Windows特定的功能,例如注册表或目录服务,使这些API在.NET Core中可用。它们仅在Windows而不是Linux或macOS上运行.NET Core时才可用,因此您需要注意,此类应用程序只能在Windows环境中运行,或者考虑到可能缺少的API。
以前的ASP.NET框架的托管模型是一个相对复杂的模型,它依赖于Windows IIS提供Web服务器托管。在跨平台环境中,这种共生关系是不可能的,因此采用了另一种托管模型,该模型将Web应用程序与基础托管分离。这次机会促成了Kestrel的发展:Kestrel:一种可以在其上运行ASP.NET Core的快速,跨平台的HTTP服务器。
与以前的设计(IIS通过它调用应用程序的特定点)不同,ASP.NET Core应用程序是控制台应用程序,这些应用程序自托管Web服务器并直接处理请求,如图1.6所示。从概念上讲,这种托管模型要简单得多,尽管您无需删除在生产环境中运行IIS(或等效版本)的需求,但可以从命令行测试和调试应用程序。
图1.6 ASP.NET(顶部)和ASP.NET Core(底部)中的托管模型之间的区别。在ASP.NET的早期版本中,IIS与应用程序紧密结合。 ASP.NET Core中的托管模型更简单; IIS将请求移交给ASP.NET Core应用程序中的自托管Web服务器并接收响应,但对应用程序没有更深入的了解。
更改托管模型以使用内置HTTP Web服务器创造了另一个机会。过去,性能一直是ASP.NET应用程序的痛点。肯定有可能构建高性能的应用程序-堆栈溢出(https://*.com)证明了这一点-但Web框架本身并未以性能为优先设计,因此最终可能有点障碍。
为了具有竞争力的跨平台,ASP.NET团队致力于使Kestrel HTTP服务器尽可能快。多年来,TechEmpower(www.techempower.com/基准)一直在各种语言的整个Web框架上运行基准。在纯文本基准测试的第18轮中,TechEmpower宣布,经过测试的350多个框架中,带有Kestrel的ASP.NET Core进入前十名![7]
Web服务器:很难命名
Web编程的困难方面之一是经常相互冲突的术语的混乱排列。例如,如果您过去使用过IIS,则可能将其描述为网络服务器或网络主机。相反,如果您曾经使用Node.js构建应用程序,则可能也将该应用程序称为Web服务器。另外,您可能已经调用了应用程序在其上运行Web服务器的物理机!
同样,您可能已经为Internet构建了一个应用程序,并将其称为网站或Web应用程序,这可能是基于其显示的动态程度而任意决定的。
在本系列中,当我在ASP.NET Core上下文中说“ Web服务器”时,是指作为ASP.NET Core应用程序一部分运行的HTTP服务器。默认情况下,这是Kestrel网络服务器,但这不是必需的。如果需要,可以编写替换的Web服务器并用Kestrel代替。
Web服务器负责接收HTTP请求并生成响应。在早期版本的ASP.NET中,IIS扮演了这个角色,但是在ASP.NET Core中,Kestrel是Web服务器。
在本系列中,无论它们仅包含静态内容还是完全动态内容,我将仅使用术语Web应用程序来描述ASP.NET Core应用程序。无论哪种方式,它们都是可以通过网络访问的应用程序,因此,该名称似乎是最合适的!
对Kestrel进行的许多性能改进并非来自ASP.NET团队本身,而是来自GitHub上的开源项目的贡献者。[8]公开进行开发意味着通常可以看到修补程序和功能比以前版本的ASP.NET(其依赖于.NET Framework和Windows且发行周期长)更快地投入生产。
相反,.NET Core和ASP.NET Core被设计为以较小的增量发布。主要版本将以可预见的节奏发布,每年都会有一个新版本,并且每两年会发布一个新的长期支持(LTS)版本[9]。此外,错误修复和主要更新可以在需要时发布。 NuGet软件包提供了独立于基础.NET Core平台的其他功能。
Note
NuGet是.NET的软件包管理器,可以将库导入到您的项目中。相当于Ruby Gems,JavaScript的npm或Java的Maven。
为此,ASP.NET Core是高度模块化的,与其他功能的耦合尽可能少。这种模块性使其适用于依赖项的按需付费方法,您可以从一个简单的应用程序开始,仅添加所需的其他库,这与以前的ASP.NET应用程序的“厨房沉没”方法相反。甚至MVC都是可选包!但是不用担心,这种方法并不意味着ASP.NET Core缺少功能;这意味着您需要选择加入。一些关键的基础设施改进包括
用于定义应用程序行为的中间件“管道”
内置对依赖项注入的支持
结合的UI(MVC)和API(Web API)基础架构
高度可扩展的配置系统
默认情况下可使用异步编程为云平台扩展
这些功能中的每一个都可以在ASP.NET的早期版本中使用,但是需要大量额外的工作来设置。有了ASP.NET Core,他们就可以准备就绪,随时可以连接!
Microsoft完全支持ASP.NET Core,因此,如果您有要构建的新系统,则没有明显的理由。您可能遇到的最大障碍是,当您想使用ASP.NET Core不再支持的编程模型(例如Web窗体或WCF服务器)时,我将在下一节中进行讨论。
希望因使用ASP.NET Core生成新应用程序的许多原因而引起您的胃口。但是,如果您是现有的ASP.NET开发人员,正在考虑是否将现有的ASP.NET应用程序转换为ASP.NET Core,则完全是另一个问题。
将现有的ASP.NET应用程序转换为ASP.NET Core
与新应用程序相比,现有应用程序可能已经提供了价值,因此执行从ASP.NET到ASP.NET Core的大量重写可能总会带来切实的好处。采用ASP.NET Core的优势与新应用程序的优势几乎相同:跨平台部署,模块化功能以及对性能的关注。确定收益是否足够,将在很大程度上取决于您的应用程序的详细信息,但是有一些特征是明确的转换指标:
您的应用程序使用ASP.NET Web窗体
您的应用程序是使用WCF构建的
您的应用程序很大,具有许多“高级” MVC功能
如果您有ASP.NET Web窗体应用程序,则不建议尝试将其转换为ASP.NET Core。 Web窗体与System.Web.dll有着千丝万缕的联系,因此ASP.NET Core中永远不会提供。将应用程序转换为ASP.NET Core将有效地涉及从头开始重写应用程序,这不仅会改变框架,还会改变设计范式。更好的方法是慢慢引入Web API概念,并尝试减少对传统Web Forms结构(例如ViewData)的依赖。您可以在线找到许多资源来帮助您使用此方法,特别是www.asp.net/web-api网站。
Windows Communication Foundation(WCF)在ASP.NET Core中仅部分受支持。可以使用某些WCF服务,但充其量是最多的。没有从ASP.NET Core应用程序托管WCF服务的受支持方法,因此,如果您绝对必须支持WCF,那么现在最好避免使用ASP.NET Core。
Tip
如果您喜欢WCF的RPC风格的编程,但对WCF本身没有严格的要求,则可以考虑改用gRPC。 gRPC是一个现代RPC框架,具有与WCF相似的许多概念,并且ASP.NET Core的现成支持[10]。
如果您现有的应用程序很复杂,并且大量使用了以前的MVC或Web API扩展点或消息处理程序,则将您的应用程序移植到ASP.NET Core可能会更加困难。 ASP.NET Core具有许多与以前版本的ASP.NET MVC相似的功能,但是基础体系结构有所不同。以前的几个功能无法直接替换,因此需要重新考虑。
应用程序越大,将应用程序转换为ASP.NET Core的难度就越大。 Microsoft本身建议将应用程序从ASP.NET MVC移植到ASP.NET Core至少与从ASP.NET Web窗体移植到ASP.NET MVC一样大。如果那不吓到你,那什么也不会!
如果应用程序很少使用,不属于您的核心业务或在近期内不需要进行重大开发,那么我强烈建议您不要尝试将其转换为ASP.NET Core。 Microsoft将在可预见的未来(Windows本身取决于它!)中支持.NET Framework,而转换这些“附带”应用程序所获得的回报不太值得付出努力。
因此,什么时候应该将应用程序移植到ASP.NET Core?正如我已经提到的,入门的最佳机会是在新的小型小型项目上,而不是现有的应用程序上。就是说,如果所讨论的现有应用程序很小,或者将来需要大量开发,那么移植可能是一个不错的选择。总是最好在可能的情况下进行小迭代,而不是尝试一次转换整个应用程序。但是,如果您的应用程序主要由MVC或Web API控制器和关联的Razor视图组成,则迁移到ASP.NET Core可能是一个不错的选择。
ASP.NET Core如何工作?
到目前为止,您应该对什么是ASP.NET Core以及应将其用于哪种应用程序有一个很好的了解。在本部分中,您将看到从ASP.NET Core构建的应用程序的工作原理,从请求URL的用户到浏览器上显示的页面。要到达那里,首先您将了解HTTP请求如何在任何网络服务器上工作,然后,您将了解ASP.NET Core如何扩展创建动态网页的过程。
HTTP Web请求如何工作?
如您所知,ASP.NET Core是一个框架,用于构建服务于服务器数据的Web应用程序。对于Web开发人员而言,最常见的方案之一是构建一个可在Web浏览器中查看的Web应用程序。您可以从任何Web服务器获得的高级流程如图1.7所示。
图1.7请求网页。用户从请求网页开始,这导致将HTTP请求发送到服务器。服务器解释该请求,生成必要的HTML,然后通过HTTP响应将其发送回去。然后,浏览器可以显示该网页。
当用户导航到网站或在浏览器中键入URL时,该过程开始。 URL或网址由主机名和Web应用程序上某些资源的路径组成。导航到浏览器中的地址,使用HTTP协议将请求从用户计算机发送到托管该网络应用的服务器。
定义
网站的主机名通过通过域名服务(DNS)映射到IP地址来唯一标识其在Internet上的位置。示例包括microsoft.com,www.google.co.uk和facebook.com。
该请求可能会通过Internet传递到世界的另一端,直到最终到达与运行该Web应用程序的给定主机名关联的服务器为止。该请求有可能在途中被多个路由器接收并重新广播,但是只有在到达与主机名相关联的服务器时,该请求才会被处理。
服务器收到请求后,将检查请求是否合理,如果发出请求,将生成HTTP响应。根据请求,此响应可以是网页,图像,JavaScript文件或简单的确认。在此示例中,我假设用户已到达Web应用程序的主页,因此服务器以一些HTML响应。 HTML被添加到HTTP响应中,然后通过Internet发送回发出请求的浏览器。
一旦用户的浏览器开始接收HTTP响应,它就可以开始在屏幕上显示内容,但是HTML页面也可以引用服务器上的其他页面和链接。要显示完整的网页,而不是静态的,无色的原始HTML文件,浏览器必须重复请求过程,以获取每个引用的文件。 HTML,图像,用于样式的CSS和用于额外行为的JavaScript文件都使用完全相同的HTTP请求过程来获取。
几乎所有在互联网上发生的交互都是这个基本过程的基础。基本的网页可能只需要几个简单的请求即可完全呈现,而现代的大型网页可能需要数百个。例如,Amazon.com主页(www.amazon.com)发出606个请求,其中包括8个CSS文件,22个JavaScript文件和407个图像文件!
现在,您对该过程有了感觉,让我们看看ASP.NET Core如何在服务器上动态生成响应。
ASP.NET Core如何处理请求?
当使用ASP.NET Core构建Web应用程序时,浏览器仍将使用与以前相同的HTTP协议与应用程序进行通信。 ASP.NET Core本身包含服务器上处理请求所发生的一切,包括验证请求是否有效,处理登录详细信息以及生成HTML。
就像一般的网页示例一样,请求过程在用户的浏览器向服务器发送HTTP请求时开始,如图1.8所示。反向代理服务器会在将请求传递给您的应用程序之前捕获该请求。在Windows中,反向代理服务器通常是IIS,而在Linux或macOS上,则可能是NGINX或Apache。
定义
反向代理是负责接收请求并将其转发到适当的Web服务器的软件。反向代理直接暴露给Internet,而底层Web服务器仅暴露给代理。此设置有几个好处,主要是Web服务器的安全性和性能。
图1.8 ASP.NET Core应用程序如何处理请求。从反向代理处的浏览器接收到一个请求,该请求将请求传递给运行自托管Web服务器的ASP.NET Core应用程序。 Web服务器处理该请求,并将其传递到应用程序的主体,该主体生成响应并将其返回给Web服务器。 Web服务器将其中继到反向代理,反向代理将响应发送到浏览器。
该请求从反向代理转发到ASP.NET Core应用程序。每个ASP.NET Core应用程序都有一个内置的Web服务器,默认情况下为Kestrel,它负责接收原始请求并构造数据的内部表示形式HttpContext对象,该对象可以由该应用程序的其余部分使用。
根据这种表示,您的应用程序应该具有创建对请求的适当响应所需的所有详细信息。它可以使用HttpContext中存储的详细信息来生成适当的响应,该响应可能是生成一些HTML,返回“拒绝访问”消息或发送电子邮件,所有这些都取决于应用程序的要求。
一旦应用程序完成了对请求的处理,它将把响应返回到Web服务器。 ASP.NET Core网络服务器会将表示形式转换为原始HTTP响应,并将其发送回反向代理,反向代理会将其转发给用户的浏览器。
对用户而言,此过程似乎与图1.7中所示的通用HTTP请求相同—用户发送了HTTP请求并收到了HTTP响应。所有差异都在我们应用程序的服务器端。
您可能会认为拥有反向代理和Web服务器有些多余。为什么没有一个?好吧,好处之一是您的应用程序与底层操作系统脱钩。相同的ASP.NET Core Web服务器Kestrel可以跨平台使用,并且可以在各种代理之后使用,而无需对特定实现进行任何限制。另外,如果您编写了新的ASP.NET Core Web服务器,则可以用它代替Kestrel,而无需更改应用程序的任何其他内容。
反向代理的另一个好处是可以增强对公共互联网潜在威胁的防御能力。他们通常负责其他方面,例如重新启动已崩溃的进程。 Kestrel可以作为简单的HTTP服务器使用,而不必在反向代理后面使用时担心这些额外功能。可以将其视为关注点的简单分离:Kestrel关注生成HTTP响应;反向代理与处理与Internet的连接有关。
您已经了解了如何在ASP.NET Core应用程序中找到请求和响应,以及如何从ASP.NET Core应用程序中找到请求和响应,但是我还没有谈到如何生成响应。在本书的第1部分中,我们将研究构成典型ASP.NET Core应用程序的组件以及它们如何组合在一起。在ASP.NET Core中生成响应通常需要花费一秒钟的时间,但是在本书中,我们将逐步逐步完成一个应用程序,详细介绍了每个组件。
总结
ASP.NET Core是一个新的Web框架,以现代软件体系结构实践和模块化为重点。
最好用于新的“绿地”项目。
WCF Server和Web Forms等传统技术不能与ASP.NET Core一起使用。
ASP.NET Core在跨平台的.NET Core平台上运行。您可以使用Windows兼容包访问Windows特定的功能,例如Windows注册表。
提取网页涉及发送HTTP请求和接收HTTP响应。
ASP.NET Core允许动态构建对给定请求的响应。
ASP.NET Core应用程序包含一个Web服务器,该服务器充当请求的入口点。
通常,反向代理服务器会保护ASP.NET Core应用程序免受Internet的攻击,该服务器会将请求转发到应用程序。