asp服务器_认识ASP.NET Core / 基础

db861fdc7c86584db1a55728f07a20d4.png

本篇主题:http://ASP.NET Core进程的启动及核心组件。

启动代码概览

首先使用.NET Core cli 命令 dotnet new web 来创建一个空白的http://ASP.NET Core项目,这里使用的.NET Core版本为2.1.3,http://ASP.NET Core版本是2.1.2。(如果你愿意完全可以从一个空白的cs项目开始开发http://ASP.NET Core应用)

66b1272135637b66717eeee5e95ff41a.png
新建空白asp.net core web项目的目录结构

创建好项目后项目目录下有两个代码文件Program.cs和Startup.cs,一个空的wwwroot文件夹以及Properties文件夹和其中的launch.json文件。了解了项目文件后,我们从程序的入口Program.cs文件开始来看看http://asp.net core的启动过程。

Program.cs

public 

Startup.cs

public 

Program.cs中代码执行了下面4个方法:

  1. 执行WebHost.CreateDefaultBuilder(args)静态方法,创建IWebHostBuilder对象。
  2. 执行IWebHostBuilder.UseStartup<Startup>()。
  3. 执行IWebHostBuilder.Build(),创建一个IWebHost对象。
  4. 执行IWebHost.Run()。

这就是http://ASP.NET Core启动的全过程,下面简单解读这四个方法的源代码。

CreateDefaultBuilder(args),这个方法new了一个WebHostBuilder对象并读取或设置了一些默认配置,如应用目录,WebServer,应用配置,环境变量,日志对象等。需要说明的是这里的WebHost类是一个静态类并不是实现IWebHost接口的类。

CreateDefaultBuilder(args)方法源代码​github.com
287558c30c9661529ef9157514520bc6.png

然后是IWebHostBuilder对象的UseStartup<Startup>()方法,这个方法的逻辑很简单,将Starup类注册到容器中,这个容器非常重要。其中Startup类中包含了配置服务与Middleware的方法,我们会稍后介绍这些内容。

UseStartup<Startup>()方法源代码​github.com
287558c30c9661529ef9157514520bc6.png

WebHostBuilder对象的Build()方法,这个方法使用之前的配置构造了new WebHost所需的一系列对象,包括:已创建的服务对象集合,容器对象,配置对象等,然后执行WebHost的初始化方法返回WebHost对象。

WebHostBuilder.Build()方法源代码​github.com
287558c30c9661529ef9157514520bc6.png

IWebHost.Run()方法,这个方法是IWebHost的扩展方法,它只有一行代码:

public 
WebHostExtensions.cs源代码​github.com
287558c30c9661529ef9157514520bc6.png

这便是http://ASP.NET Core启动过程非常简单的描述,限于篇幅并没有更深入的解读每个方法,有兴趣的读者可以自行查阅源代码。


配置与WebServer

appsettings.json

http://ASP.NET Core已经不使用web.config作为配置文件,默认使用appsettings.json文件,只要你在应用程序根目录中添加该文件,文件内的配置就会被读取。通过Configuration类或者注入IConfiguration对象来访问配置。除了简单的字符串和数值,配置文件也支持POCO对象(plain old CLR object/简单CLR对象,即只包含简单类型属性的类),下面是配置文件内容及配置读取的示例。

配置文件:

{
  

配置读取代码:

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.

http://ASP.NET Core支持从下列的位置/方式读取配置:

  • Azure Key Vault/Azure键值库
  • Command-line arguments/命令行参数
  • Custom providers (installed or created)/自定义配置提供程序
  • Directory files/目录文件
  • Environment variables/环境变量
  • In-memory .NET objects/内存中的.NET对象
  • Settings files/配置文件

Kestrel&Http.sys

与http://ASP.NET不同,http://ASP.NET Core“内置”了两个WebServer,Kestrel与HTTP.sys,作为进程内的HTTP服务器,其主要功能是监听HTTP请求并将一系列请求功能组成HttpContext提供Web应用使用。

其中Kestrel是一款微软为http://ASP.NET Core开发跨平台的开源Web服务器,Kestrel意为红隼,是一种分布广泛的小型猛禽,飞行快速。寓意该Web服务器小而快的特点。

6291029128027d16c0ddee7470b3e2c6.png
飞行中的红隼

你可以在部署中单独使用Kestrel或配合一个反向代理服务器,如下图所示。

a3f07f5d8164c637fb6d41f3eb345154.png
单独使用Kestrel

1d1bb11016ab995416098b6b76fab3d5.png
结合反向代理服务器

Http.sys为Windows平台内核功能,实际上IIS的HTTP监听正是运行在Http.sys之上。当你需要在Windows平台上部署但又不使用IIS时你可以使用Http.sys作为WebSever或者需要仅Http.sys支持的功能,如Windows Authentication时也应选择使用Http.sys。不过Kestrel与反向代理服务器的结合可以支持绝大多数WebServer功能,所以推荐使用Kestrel。

两种WebServer对比:

95aa9095d6a6d0644847817e54fcfe1d.png
Kestrel对比Http.sys

WebServer的配置可以通过Program.cs中BuildWebHost方法中的IWebHostBuilder对象来行进,如下面代码示例(http://ASP.NET Core默认使用Kestrel)。

//使用Http.sys及配置代码

配置选项及具体内容请查阅下面的文档:

Web server implementations in ASP.NET Core​docs.microsoft.com
dc3edd467a9d2461b920a8c0b1c67d35.png

核心概念(Services,Pipeline,Middleware)

重点!重点!重点!

http://ASP.NET Core中有三个核心概念:服务(Services),中间件(Middleware)与请求管道(Request Pipeline),下面先介绍服务。

什么是服务?http://APS.NET Core中的服务就是实现业务逻辑所需的功能组件,之所以称之为服务是因为这些功能组件都放在内置的容器中或者说我们将放在容器中的功能组件称作服务。

什么是容器?http://ASP.NET Core内置一个DI容器(或称为IOC容器),我们通过IWebHost对象的Services属性(IServiceProvider类型)获取服务,通过Startup类中ConfigureServices方法的services参数(IServiceCollection类型)来注册服务,http://ASP.NET Core的大多数功能组件都注册在容器中。该容器由包Microsoft.Extensions.DependencyInjection实现。

Microsoft.Extensions.DependencyInjection源代码​github.com
287558c30c9661529ef9157514520bc6.png

为什么需要容器?通过这个容器可以实现依赖注入(DI)/控制反转(IoC)的设计模式,这个模式是http://ASP.NET Core设计的核心。如果不了解依赖注入(Dependency Injection)请另行查阅,下面两个链接提供参考。

Dependency Inversion Principle​deviq.com
2b5c9da69381937f33379ff2fa841928.png
Inversion of Control​deviq.com

依赖注入的设计模式有下面的优势:

  • 通过接口让组件的使用与实现分离,松耦合。
  • 管理组件的依赖树,比如一个组件有另外的依赖,这种情况我们会需要不停的new对象。如果使用依赖注入容器我们只需要指定我们需要的组件(比如构造函数注入)容器就会管理好所有的依赖,并且在组件不被需要时释放它。
  • 更好的支持单元测试。
  • http://ASP.NET Core的容器支持组件的生命周期管理。

我们一步一步来看在这个容器的使用,首先是如何在容器中注册一个服务,这个操作在Startup类的ConfigureServices方法中进行,其中的services参数提供了一系列的注册服务的方法。

public 

在注册服务的同时可以配置对象的生命周期,http://ASP.NET Core提供了三种生命周期:

  • Transient,每次被使用到时就创建新的实例。
  • Scoped,每次请求创建一个实例。
  • Singleton,在第一次被用到时创建之后都是用这个实例,也就是单例模式。

需要注意的是不同生命周期服务之间的相互依赖会导致服务生命周期的变化,参考下面的文档。

Dependency injection in ASP.NET Core​docs.microsoft.com
dc3edd467a9d2461b920a8c0b1c67d35.png

服务的使用相对简单的多,仍以Starup类为例,其中的Configure方法就可以使用容器提供的依赖注入,所以你只需要在方法中添加你所需要的类型就可以使用该服务了。

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.

在实际开发中,我们更多地会在MVC的Controller中使用服务,在Controller中一般使用构造函数注入来使用服务。下面代码所示使用了一个IDateTime的服务。

using 

http://ASP.NET Core包含了很多内置服务,如下图所示:

7c17ed5b774bdb968fe41a1eb0ddec0e.png
ASP.NET Core内置服务

理解并使用好这些服务可以让我们的开发事半功倍,关于服务与容器还有很多细节,更多内容可查看下面的文档。

Dependency injection in ASP.NET Core​docs.microsoft.com
dc3edd467a9d2461b920a8c0b1c67d35.png

下面介绍Pipeline和Middleware,我们知道Web应用的核心是处理HTTP请求,而HTTP请求所经过的“通道”在http://ASP.NET Core中我称之为请求管道Pipeline,Middleware则是组成这个管道的零件,我们可以把Middleware想象为一节一节的管子,一起拼凑了一个完整的管道。 Middleware的本质是一个处理HttpContext的委托,而委托的“本质”又是方法,所以Middleware就是处理请求的方法,这个方法做两件事情:

  1. 决定是否执行下一个Middleware。
  2. 在其后的Middleware被调用前和完成后执行自身的业务逻辑。

99dce6c38fb507801f18bd5811efea5d.png
Middleware在请求管道中的模型

我们通过Starup类中Configure方法参数app(IApplicationBuilder类型)的三个方法来对Pipeline进行配置,它们分别是Run,Use,Map。其中Use方法就是为管道注册一个Middleware,而Run方法则是管道的终点,通过它注册的Middleware委托不存在next参数。

public 

Map则相当于为特定的请求Url创建一整个管道。

public 

Middleware的顺序就是你在Conifg方法中Use,Run,Map的顺序。顺序十分重要,比如在app.Run方法后面注册的Middleware将不会被执行到,还有像处理异常的Middleware应该放在最开始这样它才能够捕获所有Middleware上的异常。

上面解释了Pipleline与Middleware以及在代码层面的体现,现在说说如何在实际开发中开发Middlerware,如果把全部Middlerware都以app.Use的方式来注册的话代码会显得非常冗长也不符合模块化的设计理念,幸好http://ASP.NET Core中已经有标准的Middleware开发流程。

一句话说明标准化的Middleware:将委托封装在一个类中,并以扩展方法的方式提供使用。

下面就是一个“标准”的Middleware,InvokeAsync是它处理请求的方法,而next则在构造函数中注入。

using 

这样我们就可以UseMiddleware<RequestCultureMiddleware>()的方式使用这个Middleware了,但是这样还是不够“优雅”,我们需要为IApplicationBuilder添加一个扩展方法UseRequestCulture,代码如下

using 

这样我就可以在Startup类中“优雅”的使用我们的Middleware了。

public 

关于Middleware有下面几个重点需要了解:

  1. 生命周期与应用的生命周期相同,也就是Middleware在应用启动的时候被构造并不是在应用收到请求时,而且只生成一次。
  2. 需要有一个InvokeAsync方法来做为Middleware处理请求的入口,方法需要返回一个Task,你可以在这个方法中添加额外由容器提供服务作为参数。
  3. 基于工厂的Middleware可以实现生命周期与每次请求相同,限于篇幅详细信息请查看下面的文档:
Factory-based middleware activation in ASP.NET Core​docs.microsoft.com
dc3edd467a9d2461b920a8c0b1c67d35.png

http://ASP.NET Core也内置了很多Middleware,它们提供的功能可以极大的方便我们的开发。

0f086cff7b67809b9726a7a90ab712b7.png
ASP.NET Core内置Middleware

关于Middleware更多内容请查看下面的官方文档。

ASP.NET Core Middleware​docs.microsoft.com
dc3edd467a9d2461b920a8c0b1c67d35.png

其他需要知道的

整个http://ASP.NET Core基础包含很多内容,无法在一篇文章中介绍完整,下面是一些个人认为在开发中会用到或者是需要了解的知识点。

环境变量

http://ASP.NET Core会读取系统中环境变量ASPNETCOREENVIRONMENT的值来确定当前的环境,你可以设置任何的值,不过“Development”,“Staging”,“Production”这三个值是由框架支持的,通过env.IsDevelopment(),env.IsDevelopment(),env.IsDevelopment()体现,当然如果你使用其他值的话也可以通过env.IsEnvironment("your_value")方法来判断当前环境是否是“your_value”。

launch.json

这个存在于Properties文件夹的文件用于在开发时对Web应用运行环境进行配置,包括WebServer与环境变量。

StaticFiles

http://ASP.NET Core默认将应用目录下的wwwroot文件夹作为静态文件的根目录,你也可以使用下面代码所示的方式配置自己的静态文件目录。

public 

GenericHost

我们之前所使用的都是WebHost,因为我们处理的是HTTP请求,其实http://ASP.NET Core也支持开发非HTTP的Host应用,如消息队列,后台任务等。

除此之外还有一些其他的相对重要的知识点,提供大家作为扩展阅读的参考。

  • Routing
  • WebSockets
  • WebHost启动过程中的异常捕获与处理
  • 全球化与本地化
  • IHttpClientFactory服务
  • http://ASP.NET Core Module

有兴趣的读者也可以前往http://ASP.NET Core官方文档页面深入阅读。

ASP.NET Documentation​docs.microsoft.com
dc3edd467a9d2461b920a8c0b1c67d35.png

总的来说http://ASP.NET Core并不是http://ASP.NET简单复制的开源版本,它经过重新设计,完全支持跨平台,有很强的设计模式痕迹(如依赖注入/DI,仓库模式)并在此基础上实现了很好的模块化与松耦合,以及大量使用异步方法,在扩展性和性能上都有提升,而且它还是开源的!

希望这篇文章能成你学习http://ASP.NET Core的一块敲门砖。有任何疑问或问题欢迎通过评论或私信指出,非常感谢。

【新人注意:下载后评价,CSDN会把下载分还给你!切记!不放心的请看完下面:】 ==================== 我晕死,声明几点: 1.我对骂人的人十分无奈也无语,素质低就不要出来丢人了; 2.资源是我觉得好才放上来跟大家分享的,简易便携,平时带到机房或者测试都很方便,这个完整纯净的版本现在网上已经不好找了,要么就是广告捆绑什么的一堆; 3.至于下载分,只要你评论了,不仅退还所有分还多送1分,CSDN的老规矩,怕什么。我也要下资源,赚点积分而已; 4.病毒的问题已经解释过很多遍了(见简介),信不信装不装凭自己判断,请少数人注意文明,低碳生活,谢谢大家; 5.没用过的可以先看评论~多翻几页,相信你会找到答案。诚请先试用后评价,祝您使用愉快,谢谢! ======================================== 关于有人说资源是“盗取来的”:哦,好吧,我被你打败了。你真的很逗,事实上你可以联系原作者,让他亲自发送到你邮箱。 我先声明这个的确不是我写的程序,是网上收集来的,拿来给大家分享。CSDN上的资源很多都是转载分享的,如果还是不放心大家尽可以自己上网找,名字见标题上的几个都可以,别打错。很好的软件,很多软件站都有搜藏,但是我下过发现很多不完整或者有垃圾广告插件乱七八糟的。 关于报毒的问题:这个没有办法,因为不是正常的网站访问程序,没有安装认证的安全策略,觉得心里别扭的只能安装IIS、阿帕奇之类的大玩意了,我是不喜欢配置太麻烦才用的这个,简单无需配置。但是个人保证:安全无毒!而且无垃圾。本人已经使用三年了~杀软也就在安装时报个警,安装好再开杀软好了,就没事了。敬请放心使用! 本人一向凭着谨慎的态度上传资源,如有担心,您可以在下载先使用后再评论,出了问题再差评就是!别误导别人。 详细的介绍还看简介,祝您使用愉快,谢谢! ============================================================ 【简介】 小旋风ASP服务器,适合学习ASP的时候用。帮你构建asp网页服务器,希望能给你帮助。 因为很多人都是装的Windows XP HOME版的操作系统(囧,我的XP_Pro_SP3装IIS也出错,包括505、501错误一大堆,com密码什么的网上讲的头头是道,可是怎么试都出错,难道真是RP - -),不能装IIS(会报这样那样的错误),这个正好派上用场,做好网页后再复制到IIS服务器上就可以运行了。具体使用方法简单,里面附有说明文档! 小旋风ASPWeb2005服务器是在NETBOX核心下开发的一套简洁(只有1M多点)强大(完全支持ACCESS,SQL数据库)的ASPWEB服务器,使用这个软件的您完全可以抛弃体积庞大的WINNT,WIN2000服务器系统及漏洞百出的IIS了。现在你可以在任何一个系统上调试和发布您的ASP程序了。目前测试通过的操作系统为:Windows 98;Windows 98 SE;Windows ME;Windows NT+IE4;Windows 2000;Windows XP;Windows .NET Server。 注意:安装时有些杀毒软件会检测它有病毒,不过事实上并不是,安装的时候先把杀毒软件暂停一下,等装好后再打开。我一直用的,没有任何问题,请放心使用! ==================================================================================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值