MVC5

和WebForm的区别

WebForm是一个Page贯穿了一个.CS代码。

  • 1对1 = 耦合在一起

MVC在Controller中将 bihind和page进行了分离。

  • 多对多 = 松耦合

对于MVC来说是通过action返回相应的View

VS的调用堆栈 Http管道的大致流程

PipelineRumtime => HttpRuntime => HttpApplication => MvcHandler => Controller => HomeController

理解管道流

HttpPipeline管道

一个Http请求过来,我们的IIS和website是如果处理请求。然后到我们的代码中。这样一个流程。

MVC和webForm都是基于ASP.NET框架。也就是他们的管道流都是差不多的。MVC在管道流中通过Module的方法做了一个截取。WebForm则是得益于IIS处理程序映射。下图可以看到一般处理程序是使用SimpleHandlerFactory进行处理的

HttpModule与HttpHandler概念

httpmodule是拦截程序,而httpHandler是处理程序。我们一般程序程序就是继承此IHttpHandler。也就是我们的请求处理程序。

下图的线就代表着我们的管道流,从IIS(还有一个sys.http 内核驱动)转发给w3wp,然后w3wp再把请求交给

应用程序。

在应用程序初始化的时候我们可以进行拦截。而httpmodule就是一个管道流的拦截器。可以在module中对请求进行监控或者修改。httpHandler就是我们的处理程序。

.ashx的处理映射类,System.Web.UI.SimpleHandlerFactory这个工厂来进行生成Handler。

程序托管在w3wp上,可以进行调试代码。来看到从w3wp(应用程序域转换)后的管道流的流程

下图是我们的调用堆栈

第一个被执行的方法是 ProcessRequestNotification

= >

InitializeRequestContext(nativeRequestContext, flags, out wr, out httpContext); => 构造上下文 HttpContext

=>

wr = IIS7WorkerRequest.CreateWorkerRequest(nativeRequestContext, etwProviderEnabled); => iis工作请求创建一个WorkerRequest,然后使用wr 来实例化一个Http上下文

=>applicationInstance = HttpApplicationFactory.GetApplicationInstance(context); => 有了Context后就要开始构造HttpApplication,通过Context进行构造。HttpAlication其实就是Global

=> state = (HttpApplication) HttpRuntime.CreateNonPublicInstance(this._theApplicationType); =>这里进行使用反射创建httpapplication(gloBal.asax)。值得一提的是,这里会有一个缓存从this._freeList.Pop()去取,下次就不会再进行创建了。下面会进行InitIntegratedModules() 初始化我们的拦截器

=> InitIntegratedModules() =>这里的初始化modules分为集成模式与非集成模式(经典模式)的初始化。非集成直的是this.InitModules()

=> this._stepManager.BuildSteps(this._resumeStepsWaitCallback); 构造Handler ManagedPipelineHandler、AspNetFilterModule

这里需要注意获取handler的类

MaterializeHandlerExecutionStep=> 我们在IIS的处理程序映射的那个工厂类,在这里的MaterializeHandlerExecutionStep类中使用了这个工厂类的GetHandler方法拿到了Handler

CallHandlerExecutionStep=>执行我们的PR函数。

=> 管道流结束

MVC5-1 ASP.NET的管道流的更多相关文章

  1. 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?

    在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.总的来说,管道由一个服务器和一个HttpApplication构成 ...

  2. ASP.NET Core管道深度剖析(4):管道是如何建立起来的?

    在<管道是如何处理HTTP请求的?>中,我们对ASP.NET Core的请求处理管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.这样一 ...

  3. ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程

    从<ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求>我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但 ...

  4. Java IO7:管道流、对象流

    前言 前面的文章主要讲了文件字符输入流FileWriter.文件字符输出流FileReader.文件字节输出流FileOutputStream.文件字节输入流FileInputStream,这些都是常 ...

  5. 【深入ASP.NET原理系列】--ASP.NET请求管道、应用程序生命周期、整体运行机制

    微软的程序设计和相应的IDE做的很棒,让人很快就能有生产力..NET上手容易,生产力很高,但对于一个不是那么勤奋的人,他很可能就不再进步了,没有想深入下去的动力,他不用去理解整个框架和环境是怎么执行的 ...

  6. MVC5-2 MVC的管道流与路由

    自定义Modue与Hander 之前讲了管道流中的Module与Hndler.现在我们可以去自定义Module和Handler Module 其实很简单,一共需要三个步骤 定义一个类去继承IHttpM ...

  7. JAVA基础学习day22--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码

    一.对象序列化 1.1.对象序列化 被操作的对象需要实现Serializable接口 1.2.对象序列化流ObjectOutputStream与ObjectInputStream ObjectInpu ...

  8. Java管道流

    管道流的主要作用可以用于两个线程之间的通信,有管道输出流 PipeOutputStream和管道输入流 PipeInputStream.然后通过connect将两个管道连接起来. import jav ...

  9. Java:IO流其他类(字节数组流、字符数组流、数据流、打印流、Properities、对象流、管道流、随机访问、序列流、字符串读写流)

    一.字节数组流: 类 ByteArrayInputStream:在构造函数的时候,需要接受数据源,而且数据源是一个字节数组. 包含一个内部缓冲区,该缓冲区包含从流中读取的字节.内部计数器跟踪 read ...

随机推荐

  1. 需要安全认证的远程EJB调用示例(Jboss EAP 6.2环境)

    一,Remote EJB 服务接口定义: package yjmyzz.ejb.server.helloworld; public interface HelloWorldService { publ ...

  2. easyui layout 折叠后显示标题

    (function($){ var buttonDir = {north:'down',south:'up',east:'left',west:'right'}; $.extend($.fn.layo ...

  3. 让时间处理简单化 【第三方扩展类库org.apache.commons.lang.time】

    JAVA的时间日期处理一直是一个比较复杂的问题,大多数程序员都不能很轻松的来处理这些问题.首先Java中关于时间的类,从 JDK 1.1 开始,Date的作用很有限,相应的功能已由Calendar与D ...

  4. Linux学习笔记-Ubuntu添加右键菜单打开终端

    1.进入个人目录(如/home/batsing,下文缩写成 ~ ):设置显示隐藏文件,或使用命令行:2.进入 ~/.gnome2/nautilus-scripts 文件夹,新建一个文件,名为 term ...

  5. 同态加密-Homomorphic encryption

    同态加密(Homomorphic encryption)是一种加密形式,它允许人们对密文进行特定的代数运算得到仍然是加密的结果,将其解密所得到的结果与对明文进行同样的运算结果一样.换言之,这项技术令人 ...

  6. ERROR: “System.Web.Mvc.Controller.File(string, string, string)”是一个“方法”

    ERROR: “System.Web.Mvc.Controller.File(string, string, string)”是一个“方法”,这在给定的上下文中无效 这是一个与Controller.F ...

  7. android 使用多个接口

    今天,好久没有这么用过都忘记可以这样用了.来记录下: 一个类想要使用多个接口可以implements 接口1 , 接口2,...

  8. 聚类算法kmeans

    1. 聚类问题 所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高. 2. ...

  9. 前端构建工具 webpack

    一.自我初级认知  (是什么?     能干什么,有卵用?       有选择为什么要选你?(比较优势在哪) )     适合的才是最好的 模块打包器(module bundler)     根据项目 ...

  10. html5 css3中的一些笔记

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" > <title> ...