第三章 解剖ASP.NET Core Web API本章首先快速回顾一下MVC。当我们使用web api时,您可能会惊讶为什么需要MVC。因为ASP.NET Web API是基于控制器、模型和视图的MVC原则设计的(在Web API的情况下,返回的响应可以被视为无视图)。 我们在本章的重点是了解为什么我们需要一个轻量级的基于http的Web API形式的服务技术,它的发展是为了满足不断变化的行业需求,微软以.NET Core和ASP.NET Core的形式进入开源世界。NET核心应用,而不局限于Windows操作系统的世界来开发ASP.NET的web应用程序。 3.1快速回顾MVC框架模型-视图-控制器(Model-View-Controller, MVC)是分离应用程序中关注点的一种强大而优雅的方法,它本身在web应用程序中应用得非常好。 Models(M): 这些是表示域模型的类。它们中的大多数表示存储在数据库中的数据,例如Employee、Customer等等。 Views(V): 这是一个动态生成的HTML页面模板。 Controllers(C): 这是一个管理视图和模型之间交互的类。视图上的任何操作都应该在控制器中有相应的处理,比如用户输入、呈现适当的UI、身份验证、日志记录等等。 3.2Web API的起源及其演化回首当年的ASP.NET基于asp.net asmx的XML web服务被广泛用于构建面向服务的应用程序,它是创建基于SOAP(简单对象访问协议)的服务的最简单方法,既可以被.NET应用程序使用,也可以被非.NET应用程序使用。网络应用程序。它只能通过HTTP访问。 2007年底,微软发布了Windows通信基础(WCF)。即使现在,WCF仍然是构建基于soa的应用程序的强大技术。这是微软。net世界的一个巨大飞跃。 WCF足够灵活,可以配置为HTTP服务、远程服务、TCP服务等等。使用WCF的契约,我们将保持整个业务逻辑代码基不变,并通过SOAP/非 SOAP将服务公开为基于http或非基于http的。 直到2010年,基于asmx的XML web服务(或WCF服务)在基于客户机的应用程序中得到了广泛的应用;事实上,一切都进行得很顺利. 但是.net和非.net的开发者。NET社区开始感到需要为客户机-服务器应用程序提供一种全新的SOA技术。这背后的一些原因如下: 1. 对于生产中的应用程序,通信时使用的数据量开始暴增,在网络上传输数据非常消耗带宽。 2. SOAP在某种程度上是轻量级的,开始显示负载增加的迹象。几个KB的SOAP包就会变成几个MB的数据传输。 3. 由于WSDL和代理的生成,在应用程序中使用SOAP服务会导致巨大的应用程序大小。当它用于web应用程序时,情况甚至更糟。 4. 对SOAP服务的任何更改都会导致更新服务代理以反映更改。对于任何开发人员来说,这都不是一项容易的任务。 5. 基于javascript的web框架发布了,并为一种更简单的web开发方式奠定了基础。使用基于soap的服务并不是最优的。 6. 平板电脑和智能手机等手持设备开始流行起来。他们有更集中的应用程序,并且需要非常轻量级的面向服务的方法。 7. 基于浏览器的单页应用程序(SPA)发展非常迅速。对于这些SPA来说,使用基于soap的服务是相当繁重的。 8. 微软发布了基于rest的WCF组件,它可以配置为以JSON或XML响应,但它仍然构建在WCF的强大技术之上。 9. 应用程序不再仅仅是大型的企业服务,而需要一个更集中的、轻量级的、易于使用的服务,它可以在几天内启动和运行。 任何看到过基于soa的技术(如ASMX、WCF或任何基于soap的技术)的发展本质的开发人员都感到需要更轻松的、基于http的服务。 只支持http、兼容json的POCO(简单的旧CLR对象)轻量级服务是当前的需要,Web api的概念开始得到发展。 3.2.1Web API简介通过web使用HTTP动词访问的任何方法都称为web API。它是一种通过HTTP传输数据的轻量级方式,很容易被各种客户机(如浏览器、桌面应用程序、手持设备、甚至其他SOA应用程序)使用。 要使web API成为成功的基于http的服务,它需要强大的web基础设施,如托管、缓存、并发、日志记录、安全性等。最好的web基础设施之一就是ASP.NET。 ASP.NET,无论是Web表单的形式还是MVC的形式,都被广泛采用,因此Web基础设施的坚实基础已经足够成熟,可以扩展为Web API。 微软通过创建ASP来回应社区的需求.NET Web API一个超级简单但非常强大的框架,用于构建仅支持http、默认json的Web服务,而不需要使用WCF。 ASP.NET Web API可用于在几分钟内构建基于rest的服务,并且可以轻松地与任何前端技术一起使用。它在2012年推出,当时最基本的需求是基于HTTP的服务,比如基于约定的路由、HTTP请求和响应消息。后来,微软发布了更大更好的ASP.NET Web API 2与ASP.NET MVC 5在Visual Studio 2013。 ASP.NET Web API2 的新特性: 使用NuGet可以简化web API 2的安装;你可以创建一个空的ASP。然后在NuGet包管理器控制台运行以下命令: Install-Package Microsoft.AspNet.WebApi web API的最初版本基于基于约定的路由,这意味着我们定义一个或多个路由模板,并围绕它工作。它很简单,没有太多麻烦,因为路由逻辑是在一个单一地方,它适用于所有控制器。 实际应用程序由于资源(控制器/操作)具有子资源而更加复杂,例如,客户拥有订单,书籍拥有作者,等等。在这种情况下,基于约定的路由是不可伸缩的。 [自定义路由].Web API 2引入了属性路由的新概念,它使用编程语言中的属性来定义路由。一个直接的优点是开发人员可以完全控制web API的uri的形成方式。 |
[Route("customers/{customerId}/orders")] public IEnumerable<Order> GetOrdersByCustomerId(int customerId) { //.... } |
[OWIN自托管]一个ASP.NET Web API依赖于ASP.NET框架,这可能会让您认为它只能托管在IIS上。然而,使用OWIN自主机,它也可以在没有IIS的情况下托管。
[跨web框架CORS]如果任何web API是使用.NET或非.NET开发的,这意味着可以跨不同的web框架使用,因此必须启用CORS。
[性能增强]IHTTPActionResult和web API OData改进是其他几个值得注意的特性,它们帮助web API 2发展成为开发基于http的服务的强大技术。
[C#增强]ASP.NET这些年来,随着c#语言的改进,如使用Async/Await的异步编程、LINQ、实体框架集成、依赖注入DI框架等,NET Web API 2已经变得更加强大。
每一项技术都必须随着硬件、网络、软件行业和ASP的不断增长的需求和进步而发展。NET Web API也不例外。
一些变化表明ASP。从开发人员社区、企业和最终用户的角度来看,NET Web API应该经历如下过程:
1. 尽管ASP.NET MVC和web API是ASP的一部分。但它们的实现和代码库是不同的。统一的代码库减少了维护它们的负担。
2. 众所周知,web api被不同的客户端使用,如web应用程序、本机应用程序、混合应用程序和使用不同技术的桌面应用程序(NET或非。NET)。但是,如何以跨平台的方式开发web API呢?在这种方式下,开发人员不必总是依赖于Windows OS/Visual Studio IDE。
3. ASP.NET 栈应该成为开源的,这样它才会被更大规模的采用。
4. 最终用户受益于开源创新。
我们了解了为什么要引入web api,它们是如何演变成强大的基于http的服务的,以及需要进行的一些改进。带着这些想法,微软通过推出.net Core和ASP.NET Core进入了开源世界。
net Core是一个跨平台的开源管理软件框架。它构建在CoreCLR之上,CoreCLR是一个完整的CLR. net核心应用程序的跨平台运行时实现,可以在Windows、Linux和macOS系统等跨平台上开发、测试和部署.
.NET Core 有以下重要的组件:
l CoreCLR: 这是.net核心执行引擎,执行GC的基本任务,编译成机器码。
l CoreFX: 它包含了.net Core的集合、文件系统、XML、异步等类库。
l SDK Tools: 这是一组用于日常开发经验的SDK工具。创建项目、构建、运行和测试是这些SDK工具中常见的开发人员需求.
. net Core共享了原始的.net框架的一个子集,另外它还提供了自己的一组api,这些api不属于。net框架的一部分。这就产生了一些可以同时被.net Core和.net框架使用的共享api。
net Core应用程序可以很容易地在现有的. net框架上运行,但反之则不然。net Core为操作系统的执行入口点提供了CLI(命令行接口),并提供了诸如编译和包管理等开发人员服务。以下是关于。net Core的一些有趣的观点:
l NET Core可以安装在Windows、Linux和macOS等跨平台上。它可以用于设备、云和嵌入式/物联网场景。
l Visual Studio IDE并不一定要与。net Core一起工作,但是在Windows操作系统上工作时,我们可以利用现有的IDE知识。
l . net Core是模块化的,这意味着开发人员要处理的是NuGet包,而不是程序集。
l . net Core依赖于它的包管理器来接收更新,因为跨平台技术不能依赖于Windows更新。
l 要学习。net Core,我们只需要一个shell,文本编辑器,并且它是运行时安装的。
l . net Core具有灵活的部署。它可以包含在您的应用程序中,也可以安装在用户或机器上。
l . net核心应用程序也可以自托管/作为独立应用程序运行。
. net核心支持四种跨平台场景:ASP.NET核心web应用程序、命令行应用程序、类库和通用Windows平台应用程序。它不支持在Windows上呈现桌面软件标准GUI的Windows窗体或WPF。目前,只有c#编程语言可以用来编写.net核心应用。支持f#和VB的工作正在进行中。我们将主要关注ASP。NET Core web应用,包括MVC和web API。将简要介绍CLI应用程序和库。由于其跨平台,必须安装Visual Studio IDE来创建应用程序并不是强制的。在本节中,我们将安装。net Core,构建一个非常基础的。net Core应用程序,并学习。net Core的不同命令。
打开.NET Core 网站来下载SDK.在windows环境下安装途径有两种:
l 通过VS2017下载安装模块
l 通过NET Core 2.0 SDK for Windows下载后独立安装
要进行编码,您还可以安装一个类似Visual Studio Code的文本编辑器。它是微软为Windows、Linux和macOS开发的轻量级代码编辑器。当然也以使用记事本,Vim,Atom和Sublime等.
我们将重点学习。net Core的一些基本概念,以及如何使用命令行。下面的步骤是跨平台学习。net Core。详情请参阅文档链接. 首先,让我们确保所有东西都已正确安装。打开控制台/ Shell(根据您选择的操作系统),输入以下命令来查看CLI命令和工具版本、产品信息以及运行时环境.
常见命令及含义
new:新建一个.NET项目
restore:重新加载依赖项
build:编译.NET项目
publish:发布/部署项目
run:编译并立即执行.NET项目
test:运行单元测试
pack:给项目创建NuGet包
ASP。NET Core是一个新的开源跨平台框架,用于使用。NET构建现代的基于云的web应用程序。ASP。NET Core是完全开源的,你可以从GitHub下载. 它是跨平台的,这意味着你可以开发ASP。NET Core应用在Linux/macOS上,当然还有Windows OS上。
ASP。NET第一次发布是在15年前,当时使用的是.NET框架。从那时起,它就被数以百万计的开发人员用于大大小小的应用程序。由于。net Core是跨平台的,ASP。NET在开发和部署web应用程序方面跨越了Windows OS环境的界限。让我们来看看跨平台ASP.NET的更多细节。
对ASP.NET Core提供了以下见解:
l ASP.NET Core既可以运行在完整的.NET框架上,也可以运行在.NET Core上。
l 使用了完整的.NET框架开发的ASP.NET Core web程序与只能在Windows机器上开发和部署。
l 当使用.net core时,可以选择一个平台来开发和部署它。Windows、Linux和macOS的标志表明您可以使用ASP.NET Core。
l ASP.NET Core在非windows机器上使用.NET Core库来运行应用程序。很明显,您不会拥有所有的.net库,但是大多数都是可用的。
l 开发ASP.NET Core可以轻松地在任何机器上切换工作,而不局限于Visual Studio IDE。
l ASP.NET Core可以运行不同版本的.NET Core。
ASP。除了跨平台之外,NET Core还有许多其他的基本改进。以下是使用ASP.NET Core的优点。
l ASP.NET Core采用了一种完全模块化的应用程序开发方法——构建应用程序所需的每个组件都被很好地分解到NuGet包中。我们只需要通过NuGet添加所需的包来保持整个应用程序的轻量级。
l ASP.NET Core不再基于System.Web.dll
l 采用Visual Studio IDE开发ASP。NET应用程序在Windows操作系统上。现在,由于我们已经超越了Windows世界,我们将需要开发ASP所需的IDE/编辑器/工具。NET应用程序在Linux/macOS上。微软开发了强大的轻量级代码编辑器,适用于几乎所有类型的web应用程序,称为Visual Studio Code。
l ASP.NET Core是这样一个框架,我们不需要Visual Studio IDE/代码来开发应用程序。我们也可以使用Sublime和Vim这样的代码编辑器。要在编辑器中使用c#代码,请安装OmniSharp插件。
l ASP.NET Core与Angular、Ember、NodeJS和Bootstrap等现代web框架进行了强大的无缝集成。
l 使用bower和NPM,我们可以使用现代web框架。
l ASP.NET Core应用程序在配置系统中已经为云计算做好了准备——它只是无缝地从本地应用程序过渡到云计算。
l 内置的依赖注入。
l 可以在IIS上托管,也可以在自己的进程中托管,也可以在Nginx上托管(它是一个免费、开源、高性能的HTTP服务器,是LINUX环境的反向代理)。
l 新的轻量级和模块化的HTTP请求管道。
l web UI和web api的统一代码库。当我们研究ASP的解剖结构时,我们会看到更多这方面的内容。网络核心应用程序。
现在我们将创建一个ASP.NET Core Web API应用程序使用Visual Studio 2017 IDE。在开始之前确保这个先决条件:
安装Visual Studio 2017(安装时请选择。net Core SDK选项)。我们将一直使用社区版。ASP.NET Core 2.0预览2贯穿本书.
打开Visual Studio 2017 IDE,点击新建项目,打开项目模板对话框。
在Visual c#模板下,点击.net Core,选择ASP。NET Core Web应用程序,如下面的屏幕截图所示.
ASP.NET Core为我们提供了不同的应用程序模板来开始开发应用程序。这些模板为我们提供了一个最优的项目结构,使所有的事情都井然有序。我们有以下几种:
Empty:最简单的项目模板,只包含Program.cs和Startup.cs. 由于完全模块化的性质ASP。我们可以将这个空项目升级为任何类型的web应用程序。
Web API:这个模板包含有Controllers,web.config和其它.
Web Application:创建具有MVC类型的模板带有Controllers,Views,客户端配置,Startup.cs和web.config.
Web Application(Razor pages): 这将创建一个ASP。NET核心web应用程序使用Razor页面。
Angular,React.js: 这将创建基于javascript框架的ASP。NET核心web应用程序。
不一定要遵循ASP.NET Core提供的模板项目结构。在处理大型项目时,为了可维护性,最好将它们分割成单独的项目。默认的项目结构足以理解各种组件之间的交互。
每个应用程序都需要某种类型的身份验证来防止未经授权的应用程序访问。在前面的屏幕快照中,Change Authentication将提供以下身份验证选项.
No Authentication(不认证): 选择此选项不会向应用程序添加任何身份验证包。但是,我们可以在需要时添加这样的包来完全保护我们的应用程序数据。
Individual User Accounts(单个用户账户): 连接到Azure AD B2C应用程序将为我们提供所有身份验证和授权数据。
Work or School Accounts(工作或学校账户): 使用Office 365、Active Directory或Azure目录服务对用户进行身份验证的企业、组织和学校可以使用此选项。
Windows Authentication(Windows认证): 内部网环境中使用的应用程序可以使用此选项。
单击OK创建一个ASP.NET Core Web API项目;Visual Studio工具将立即开始恢复所需的包。
执行dot restore命令来恢复所有的NuGet包。我们看到了Visual Studio IDE工具如何帮助我们创建ASP.NETCore 应用程序在Windows操作系统。这与创建ASP NET (MVC 4/5和ASPX)应用程序类似。。
ASP.NET Core是一种跨平台技术,我们需要类似的用户体验来在Linux/macOS上创建web应用程序。众所周知,Visual Studio IDE不能安装在Linux/macOS上,因此,使用ASP有不同的方法。NET核心应用程序在非windows操作系统。
以下是Linux/macOS机器的软件需求:
l 安装nodejs
l 安装VSCode
l 安装.NET Core SDK
Yeoman是现代网络应用的网络脚手架工具。它是一个开源工具,工作起来就像使用命令行选项的Visual Studio模板。Yeoman命令行工具yo与Yeoman生成器一起工作。
Yeoman生成一个完整的项目,包含运行应用程序所需的所有文件,就像VS IDE一样。要安装Yeoman,请确保NodeJS和NPM是通过前面提供的软件先决条件中的链接安装的。
安装yeoman : (sudo) npm install –g yo
一旦Yeoman成功安装,我们需要安装ASP.NET Core生成器。它将有助于创建项目和构建web应用程序的不同组件。在命令行中,运行以下命令:
(sudo) npm install –g generator-aspnet
确保所有的东西都安装好了,打开命令行,输入yo aspnet来查看类似于Visual Studio IDE的不同项目模板。我们将创建一个web API应用程序,提供一个适当的名称,如yowebapidemo,然后按Enter键创建项目。
我们在Windows上使用Visual Studio IDE、Yeoman generator或Linux/macOS上使用. net Core CLI创建了一个web API项目——应用程序结构将是相同的,包括文件、文件夹和配置设置。让我们详细了解一下应用程序结构:
文件或文件夹 | 目的作用 |
/Controllers文件夹 | 这是我们放置处理请求的Controller类的地方 |
Program.cs | 程序的主入口 |
Startup.cs | 这是设置配置和连接应用程序将使用的服务所必需的 |
*.csproj | C#的项目文件 |
Appsettings.json | json型键值配置文件 |
Web.config | 这严格用于IIS配置,并在IIS上运行时调用应用程序 |
什么是模型类?
域模型或POCO类可以添加到Models文件夹中,或者我们可以为模型创建一个单独的类库。前面的项目结构是一个很好的起点;在较大的项目中,为了便于维护,我们可以将控制器、存储库和域模型分割成单独的类库。
ASP.NET Core web应用程序从根本上说是控制台应用程序就像每个控制台应用程序都需要Main()来执行一样,. net核心应用程序也有包含Main()方法的Program.cs文件。ASP。NET Core是建立在。NET Core之上的,这就是为什么我们在我们刚刚创建的应用结构中有Program.cs。查看这个文件
ASP。从根本上说,NET Core web应用程序是控制台应用程序——知道这一点难道不奇怪吗?就像每个控制台应用程序都需要Main()来执行一样,. net核心应用程序也有包含Main()方法的Program.cs文件。ASP。NET Core是建立在。NET Core之上的,这就是为什么我们在我们刚刚创建的应用结构中有Program.cs。查看这个文件
namespace MyFirstCoreAPI { public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>(); } } |
就像任何.net控制台应用程序需要Main()方法来开始执行一样,. net Core运行时将通过调用Main()方法来启动应用程序。
IWebHostBuilder接口需要运行这些控制台应用程序作为web应用程序.
WebHost它已经预先配置了运行应用程序的默认值。这意味着web应用程序需要web服务器(Kestrel)、IIS集成设置、读取各种值的配置文件和Content Root文件夹。所有这些需求都在这个方法中预先配置好了。
UseKestrel():是一种扩展方法,其作用类似于运行ASP的web服务器。网络核心应用程序。它是基于libuv的。Kestrel通常被称为负责运行应用程序的内部web服务器。它是轻量级的、快速的、跨平台的。
UseContentRoot():是用于指定web主机要使用的内容根目录的扩展方法。这通常是当前工作目录;可以将其配置为指向另一个文件夹,该文件夹包含运行应用程序所需的所有文件。
UseIISIntegration():IIS被认为是一个暴露在internet上的用于接收请求的外部web服务器。
ConfigureAppConfiguration: 读取配置文件,并添加UserSecrets和环境变量。
ConfigureLogging: 设置控制台和调试窗口的日志记录。
UseStartup<Startup>():设置类以配置各种服务,如点击请求-响应管道等。Startup是一个简单的类,没有任何基类,有两个方法:Configuration和Configure.
Build():
Run():运行Kestrel网络服务器.
在ASP.NET Core,当webHostBuilder从Main()运行时调用Startup类,所有应用程序都需要它。它是任何请求到来或返回响应时的第一行执行。它执行一系列操作,比如提供依赖项注入、添加和使用各种中间件组件等等。cs类必须定义Configure和ConfigureServices方法;它们将在主机开始运行时被调用。
ASP.NET Core是完全模块化的,也就是说,如果你真的需要的话,你可以添加组件。通过这种方法,web应用程序在部署和性能方面变得轻量级Startup.cs类的Configure方法的主要目标是配置HTTP请求管道。在下面的启动代码示例中。可以看到,IApplicationBuilder使用扩展方法来配置管道。UseMvc扩展方法将路由中间件添加到请求管道,并将MVC配置为默认处理程序,如下所示:
app.UseMvc();
我们已经创建了一个简单的web API,因此,我们使用MVC。您可能想知道为什么当我们正在与MVC web api ?原因是ASP。网络核心有一个统一的MVC和web API。IApplicationBuilder定义了一个(app)类,它提供了管道机制来配置应用程序的请求。您可以构建定制的管道配置中间件,使用一个扩展方法,并将它们添加到IApplicationBuilder参见第六章,中间件和过滤器,致力于这一点。默认情况下,IApplicationBuilder(app), IHostingEnvironment(env)和ILoggerFactory(log)注入服务器web API或MVC项目.
public void Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory log) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseHsts(); } app.UseHttpsRedirection(); app.UseMvc(); } |
ConfigureServices方法设置应用程序可以使用依赖项注入(DI)运行的所有服务。它将服务列表添加到IServiceCollection实例,并在配置之前调用。之所以在运行时首先调用此方法,是因为需要在准备好请求管道处理之前添加一些特性,如MVC、Identity、实体框架等。因此,在前面的代码中,我们看到了services.AddMvc()。ConfigureServices方法有助于在ASP中实现依赖注入模式。网络核心应用程序。让我们来看一个简单的例子,假设我们通过实现INewsOfDay接口来编写NewsOfDay类。我想使用DI模式,这样任何其他类都可以轻松地注入这个接口来获得当天的报价。
public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); services.AddSingleton<INewsOfDay, NewsOfDay>(); } |
ASP.NET Core默认支持依赖注入;我们不需要使用任何第三方DI容器,如Unity、StructureMap、Autofac等。但是,如果开发人员觉得需要使用其他DI容器,他们可以覆盖默认的实现。
任何。net开发人员都应该熟悉.NET项目中的*.csproj文件;与传统的.net应用程序相比,它是一个非常精简的版本。在初始版本的ASP.NET Core,基于json的项目。json文件用于包管理,但为了与其他。net应用程序保持同步并与MSBUILD系统良好地工作,它被删除了。
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp2.1</TargetFramework> </PropertyGroup> <ItemGroup> <Folder Include="wwwroot\" /> </ItemGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.App" /> <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.2" PrivateAssets="All" /> </ItemGroup> </Project> |
n TargetFramework标记指向netcoreapp2.0。这是ASP。NET标准2.0的核心名。
n Folder标签包含了wwwroot,表明在build的时候包含此文件夹.
n PackageReference是项目中包含的NuGet包或任何自定义库。Microsoft.AspNetCore。所有的元包引用所有的ASP。NET核心包,只有一个版本号。任何新版本只能通过更改此版本来更新。尽管您可以将它们作为单独的包添加,但建议使用Microsoft.AspNetCore.All。
ASP.NET (MVC和ASPX)的所有请求处理都依赖于system.web.dll。它用于完成所有繁重的浏览器-服务器通信工作,并且与IIS紧密耦合。ASP.NET Core通过完全删除system.web.dll实现跨平台;这导致了一种完全可插拔的请求处理技术。这种移除也有助于MVC和ASP.NET中的web API栈的统一。ASP。NET Core不区分MVC和web API,因此请求处理现在将是通用的。在下一节中,我们将学习更多关于统一的内容。下图展示了ASP。网络核心请求处理.
各种客户机,如web应用程序(浏览器)、本机应用程序和桌面应用程序,都会访问驻留在外部web服务器(如IIS/ Nginx)上的web api。有趣的是,IIS现在是外部web服务器的一部分,因为它不运行ANC应用程序。它只充当在internet上公开的主机web服务器。Nginx是Linux机器上IIS的对应版本。
IIS/ Nginx调用安装在机器上的dotnet运行时来启动处理请求。处理来到了.NET Core.保存在ANC app中的web.config文件就是负责这一目的.
Dotnet运行时调用Kestrel web服务器(内部web服务器)来运行应用程序。Kestrel是基于libuv的开源轻量级跨平台web服务器;这是实现ASP的重要步骤之一。NET核心应用程序真正跨平台。然后,Kestrel通过应用程序中提供的Main()方法启动应用程序。记住,ASP。NET核心应用程序是控制台应用程序。program.cs中的Main()方法是。net核心应用程序的起点。
然后Main()方法构建并运行webHostBuilder。然后,将请求推入Program.cs类的Configure方法;这里配置了HTTP请求管道。我们在前面创建的默认web API模板项目只在管道中添加了app.UseMvc()。我们可以以中间件的形式定制HTTP请求管道处理逻辑。
l MVC中间件构建在处理请求的通用路由中间件之上。此时,将处理请求,并将其发送到适当的控制器进行处理。
l 当请求处理完成时,响应以相反的顺序通过相同的管道发送。如果请求无效,定制中间件可以帮助我们返回响应。
ASP。NET核心请求管道处理是完全可插拔的;配置方法应该只包含所需的中间件,而不是ASP.Net web堆栈中出现的沉重的system.web.dll。
MVC和web API在ANC中的统一是主要的体系结构演进之一。在ANC中MVC和web API控制器没有区别。在先前的ASP。NET栈,MVC中的控制器和web API中的控制器分别派生自各自的基控制器,如下所示:
public class HomeController:Controller { //老版 ASP.NET MVC 控制器继承与Controller } public class ValuesController:ApiController { //老版 ASP.NET API继承与ApiController } |
同时,ASP。NET MVC 4/5和web API 2,有控制器、动作、过滤器、模型绑定、路由和属性,但是它们有不同的代码基,原因如下:
l NET MVC(4/5)依赖于System.web.dll,这是绑定到IIS托管。
l ASP。NET Web API被设计成自托管的;它不依赖于IIS来托管。
ASP. NET Core的设计思想是让它能够独立于IIS进行托管。通过这种方式,删除了system.web.dll,这样就可以在没有IIS的情况下托管它。这导致了MVC和web API的合并,形成了一个单独的代码库。在ASP。NET Core、MVC和web API共享相同的基本控制器,因此MVC和web API在实现上没有区别。
我们的ASP.NET Core Web API是由Visual Studio 2017 IDE为Windows环境和Yeoman generator为Linux/ macOS创建的。我们将使用IIS Express或Kestrel服务器运行应用程序。在运行应用程序之前,让我们进一步了解Values控制器(默认情况下创建的)。在Controllers文件夹下,它有一个名为c#的类文件
namespace MyFirstCoreAPI.Controllers { [Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { // GET api/values [HttpGet] public ActionResult<IEnumerable<string>> Get() { return new string[] { "value1", "value2" }; } // GET api/values/5 [HttpGet("{id}")] public ActionResult<string> Get(int id) { return "value"; } // POST api/values [HttpPost] public void Post([FromBody] string value) { } // PUT api/values/5 [HttpPut("{id}")] public void Put(int id, [FromBody] string value) { } // DELETE api/values/5 [HttpDelete("{id}")] public void Delete(int id) { } } } |
Web api基于模型、值和控制器概念。cs是客户端通过HTTP访问的c#类.
它派生自控制器基类,该类使任何类都成为MVC或web API控制器
[Route("api/[controller]")]定义路由策略。可以根据此配置访问控制器
ValuesController提供了以下可以通过HTTP访问的方法
方法名 | HTTP动词 | 备注 |
Get() | HttpGet | 返回IE<string> |
Get(int id) | HttpGet | 由值返回字串 |
Post([FromBody] string value) | HttpPost | 使用POST插入字串 |
Delete(int id) | HttpDelete | 删除字串 |
3. 在使用Visual Studio 2017 IDE时,我们有两种运行ASP的方法。NET核心应用:
使用IIS Express:如果你想使用IIS Express。按F5开始运行应用程序;它打开所选的web浏览器。
使用Kestrel server:如果您想运行Kestrel服务器,请从运行选项中选择MyFirstCoreAPI。按F5开始运行应用程序;它打开所选的web浏览器和控制台窗口。在这些环境中,我们将使用命令行选项来运行应用程序。他们使用Kestrel服务器来运行应用程序。
GITHUB上的.Net Core
在这一章中,我们已经讨论了很多内容。我们首先介绍了MVC,然后看了ASP。NET Web API在过去十年中已经成熟。在此基础上,我们学习了如何使用。net Core和跨平台框架的强大功能。我们理解的ASP。NET Core及其架构,我们使用。NET Core SDK来建立我们的系统。我们还使用Visual Studio工具和Yeoman生成器创建了一个web API。我们详细地学习了ASP。NET核心请求处理和web API与MVC统一成一个单一的代码库。
咨询电话
0371-68632068