从Asp .net到Asp core (第一篇)《回顾Asp .net生命周期与管道机制》

从2016年微软收购了Xamarin整合到Visual Studio里并将其开源到如今已有三年多时间,从.net core 1.0 到如今的2.2,以及即将问世的3.0,咱们看到微软正在跨平台之路越走越远,从以前的偏科学生变成了如今的三号学生,但愿觉得之后还会愈来愈好css

做为微软的狂热粉,从17年末就开始热衷于.net core 的学习和使用,下面谈谈我对web 框架asp core的简单理解html

1:首先第一个问题.net core和Asp core有什么区别?是同一个东西吗?java

  .net core是一个统一的平台,是微软准备要用来开发移动端,桌面应用,web网站等的总体平台linux

  asp core 是.net core着重开发网站的web 框架,这也就就比如以前.net框架与Aps .net框架的关系,能够理解为包含关系吧程序员

2:Asp core与原来的Asp .net框架有什么区别,它对比传统Asp .net框架到底有哪些好处?web

  首先我想说,Asp core其实对比原来的Asp .net,其实能够说彻底是一套新的东西(并不像以前Asp .net到Asp .net MVC,Asp .net MVC只是在原有的Asp .net框架扩展和升级,其本质仍是.net框架的那一套)。windows

可是Asp core虽然说是一套新的框架,听到说是新的东西也没关系张,我的感受Asp core不少基础开发的用法,仍是保留了原来.net开发人员的一些开发习惯,实际开发过程当中我的的感受没有给人一种陌生的感受
浏览器

  对比Asp core与Asp .net的区别:服务器

  • 首先一条Asp core是跨平台的,何为跨平台,就是Asp core能够部署和运行在windows之外的其余服务器上面(固然必需要在所要运行的系统上安装有运行时,比如java的JRE)好比更适合作服务器系统的linux服务器,并且并不像以前的Aps .net彻底依赖IIS,新的Asp core能够部署到IIS,Nginx,Apache等其余代理服务器
  • 新的Asp.net core默认使用Kestrel做为Http请求的监听器,而并不依赖原先庞大复杂的Https.sys。Kestrel不只仅是微软下一代的跨平台Http请求监听器,同时还提供了比Https.sys更轻量级以及更快速的Http请求处理。
  • Asp.net core与原来的Web设计另外一个最大的区别在于Asp.net core(及.net core),彻底抛弃了原来的使用管道模式来接收以及处理HttpRequest。在Asp.net core中容许处理中间件(Middleware)来对全部的HttpRequest来进行请求,当请求被接收到时,Asp.net core会调用注册的中间件(按照注册的顺序)对HttpRequest进行处理。这样作相比与原来使用HttpApplication的管道方式而言,其优点在于彻底由开发人员决定HttpRequest须要执行怎么样的处理,没有多余的其余步骤。而原来的方式既使开发人员不但愿对一个HttpRequest进行任何处理,但HttpApplication仍然会按照管道的设置依次建立HttpModel -> 激活HttpHandler -> 处理Session等。相对原来的Aps .net程序,程序性能也有很大的提高

3:传统的asp .net框架请求处理流程app

  3.1 IIS服务器请求处理流程

  1,当IIS服务器接收到一个 Http请求的时候,对于IIS来讲,它依赖一个叫作 HTTP.SYS 的内置驱动程序来监听来自外部的 HTTP请求。

  在操做系统启动的时候,IIS首先在HTTP.SYS中注册本身的虚拟路径。实际上至关于告诉HTTP.SYS哪些URL是能够访问的,哪些是不能够访问的(举个简单的例子:为何你访问不存在的文件会出现 404 错误呢?就是在这一步肯定的)。

  若是请求的是一个可访问的URL,HTTP.SYS会将这个请求交给 IIS 工做者进程(IIS6.0中叫作 w3wp.exe,IIS5.0中叫作 aspnet_wp.exe。)。

  每一个工做者进程都有一个身份标识 以及 一系列的可选性能参数(是指诸如 回收机制的设置、超时时间设置 等等)。

  2,而后请求会首传递到ISAPI(Internet Server Application Programe Interface,互联网服务器应用程序接口),ISAPI决定如何去处理这个请求,若是服务器获取所请求的静态文件(也能够是文件,好比 jimmy.jpg)的后缀名以后,接下来会在服务器端寻找能够处理这类后缀名的应用程序,若是IIS找不到能够处理此类文件的应用程序,而且这个文件也没有受到服务器端的保护(好比代码文件,配置文件.config都是受保护的, 不受保护的好比js,css),那么IIS将直接把这个文件返还给客户端。

ISAPI是什么?到底长啥样?

ISAPI 服务器扩展是能够被 HTTP 服务器加载和调用的 DLL(动态连接库)

如图:

  3,而后ISAPI 还需调用 HttpRuntime的ProcessRequest方法,开始进入请求管道周期,请求最终走完整个管道周期,ISAPI 接收返回的数据流,并从新返还给 HTTP.SYS,最后,HTTP.SYS 再将这些数据返回给客户端浏览器。

上面文字总结可能有些枯燥,下面这张图片也许会清晰许多

 流程:请求开始=>Http.Sys=>ISAPI=>CLR/HttpRuntime=>ISAPI=>Http.Sys=>请求结束

  3.2 理解管道

  前面讲到请求在IIS中的一个简单流程,可是讲到当请求进入asp.net Runtime以后的细节,只是一笔带过,没有将请求在asp.net Runtime中到底通过了哪些处理,最终又是如何返回请求结果的,下面就来简单讲解一下整个过程

  这里会是涉及到在.net框架两个比较重要的概念:Http Module和 Http Handler

  想要理解这两个概念,首先要知道当请求进入asp.net Runtime以后会经历以下图的十九个事件

对于这个事件要废话几句,这个流程虽然看着比较多,对于初学者其实不要有太大压力,其实彻底不必去每个都研究他,只是大概过一遍,知道有这么个东西,混个眼熟就行了

Http Module 托管模块

若是咱们想要在上面某一个事件中去处理咱们本身框架代码,好比要在请求到达某个事件时咱们要对该请求进行筛选或者在此时记录一条日志,咱们应该怎么作?

这里就须要用到Http Module了,咱们能够经过Http Module在Http请求管道(Pipeline)中注册指望对应用程序事件作出反应的方法

Http Module实现了IHttpModule接口,IHttpModule接口要是实现Dispose和Init方法

Dispose:它能够在进行垃圾回收以前进行一些清理工做。

Init:咱们能够在init方法中注册上面十九个事件的任意一个或者多个,并在对应的回调方法中去作实际的逻辑处理

具体代码以下:

public class TestModule : IHttpModule { void IHttpModule.Dispose() { } void IHttpModule.Init(HttpApplication context) { context.EndRequest += new EventHandler(context_EndRequest); } private void context_EndRequest(object sender, EventArgs e) { /*HttpApplication对象包含了请求所须要的全部上下文对象,好比HttpContext,HttpRequest,HttpResponse,HttpSession等等,因此咱们能够经过这个对象 来完成过滤请求,记录日志等等实际开发中会用到的功能 */ HttpApplication application = (HttpApplication)sender; HttpContext context = application.Context; context.Response.Write("<hr><h1 style='color:#f00'>来自HttpModule的处理,请求结束</h1>"); } }

值得注意的是Http Module所处理的请求一般是全局的,应用级别的,不是只针对哪个页面,什么意思,好比把上面代码做为的例子,上面代码的效果会使全部的页面都会有 “来自HttpModule的处理,请求结束”,这句话

Http Handler 处理程序

对比Http Module,HttpHandler的处理请求的权限相对较低,维度也更细,它能够只针对特定后缀的页面,其实咱们的webform页面其实也就是一个Handler

全部aspx页面继承System.Web.UI.Page,能够看到Page类也实现了IHttpHandler接口

public interface IHttpHandler{ void ProcessRequest(HttpContext context); bool IsReusable { get; } }
  • ProcessRequest 用来处理请求的主要代码。
  • IsReusable 属性,MSDN上是这样解释的:获取一个值,该值指示其余请求是否可使用 IHttpHandler 实例。也就是说后继的Http请求是否是能够继续使用实现了该接口的类的实例,通常来讲,我把它设置成true。

 咱们HttpHandler用的比较多的场景就是有Ajax+Httphandler进行web无刷新页面开发,而后就是HttpHandler实现图片防盗链,IhttpHandler实现图片验证码等等,传统的Http Module和HttpHandler编写程序,其实都是比较老的开发方式了,我的感受只须要学习和了解.net有这两个东西就行了

通过上面基础的学习,咱们来总计一下进入asp.net Runtime以后,和Http Module和HttpHandler发生了哪些关系,梳理出一个流程

  1. 请求进入HttpRuntime
  2. HttpRuntime 经过HttpApplicationFactory 建立 HttpApplication对象(HttpApplication表明着程序员建立的Web应用程序。HttpApplication建立针对此Http请求的 HttpContext对象,这些对象包含了关于此请求的诸多其余对象如HttpRequest、HttpResponse、HttpSessionState)
  3. 接下来Http请求经过一系列Module对请求进行应用级别的处理
  4. Http Module处理完成后会把请求转交给HttpHandler去进行一些定制化的页面级别的处理
  5. HttpHandler在处理完成后又会转回Http Module作一些后续的收尾处理

 以上就是整个Asp.Net的生命周期,虽然在这以后,出现了Asp.Net MVC,正如前面所说,可是Asp.Net MVC框架并非一套新的框架,Asp.net Mvc仍是以Asp.net运行时为基础的。可是Asp Core并再也不以Asp.netRuntime为基础的,因此它也没有了十九个事件,也没有了Http Module和HttpHandler这一套,可是Asp Core引入了一些新的核心概念如中间件(middleware),控制反转容器(DI)等等,那么我会在下一篇文章简单解析Asp Core一些相关概念,以及它的的请求周期

 

参考资料:

http://go.microsoft.com/?linkid=8101007

https://docs.microsoft.com/en-us/previous-versions/aspnet/ms227435(v=vs.100)

http://www.tracefact.net/tech/001.html

https://www.cnblogs.com/me-sa/archive/2009/06/01/MVCLifecycle.html

相关文章
相关标签/搜索