MVC5-1 ASP.NET的管道流

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函数。

=> 管道流结束

时间: 2024-12-11 17:10:24

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

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

在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.总的来说,管道由一个服务器和一个HttpApplication构成,前者负责监听请求并将接收的请求传递给给HttpApplication对象处理,后者则将请求处理任务委托给注册的中间件来完成.中间件的注册是通过ApplicationBuilder对象来完成的,所以我们先来了解一下这究竟是个怎样的对象.[本文已经同步到<ASP.NET Core框架揭秘>之中] [

Java IO7:管道流、对象流

前言 前面的文章主要讲了文件字符输入流FileWriter.文件字符输出流FileReader.文件字节输出流FileOutputStream.文件字节输入流FileInputStream,这些都是常见的流类.当然除了这些流类之外,Java还提供了很多的流类给用户使用,本文就看一下别的流. 管道流 管道流主要用于连接两个线程的通信.管道流也分为字节流(PipedInputStream.PipedOutputStream)和字符流(PipedReader.PipedWriter).比如一个Pipe

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

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 在<管道是如何处理HTTP请求的?>中,我们对ASP.NET Core的请求处理管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.这样一个管道由一个服务器和一个HttpApplication

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

一.对象序列化 1.1.对象序列化 被操作的对象需要实现Serializable接口 1.2.对象序列化流ObjectOutputStream与ObjectInputStream ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化. ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的

java基础知识回顾之javaIO类--管道流PipedOutputStream和PipedIutputStream

管道流(线程通信流):管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream).管道输入流(PipedInputStream),如果想要进行管道输出,则必须要把输出流连在输入流之上.如图所示: 1.管道输入流应该连接到管道输出流 ,输入流和输出流可以直接连接       2.使用多线程操作,结合线程进行操作.通常由某个线程从管道输入流中(PipedInputStream)对象读取.          并由其他线程将其写入到相应的端到输出流中.不能使用单线程

IO-05内存操作流06管道流

JAVA中可以将输出的位置设置在内存上,此时使用ByteArrayInputStream,ByteArrayOutputStream来完成输入,输出功能. 利用这两个类实现大小字母的转换: package lianxijihe; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; impo

java管道流PipedStream

管道流的主要作用是可以进行两个线程间的通信

黑马程序猿——25,打印流,合并流,对象序列化,管道流,RandomAccessFile

------<ahref="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 黑马程序猿--25.打印流.合并流.对象序列化,管道流,RandomAccessFile /* IO流的打印流:专门用于打印的流 字节打印流PrintStream PrintStream的构造函数能够接收file对象,String型字符串路

MVC5-2 MVC的管道流与路由

自定义Modue与Hander 之前讲了管道流中的Module与Hndler.现在我们可以去自定义Module和Handler Module 其实很简单,一共需要三个步骤 定义一个类去继承IHttpModule.并实现接口,这里推荐类以Module结尾 在Init方法中注册我们所需要的事件,完成拦截器. 在WebConfig的System.webServer节点中配置Modules Handler 和自定义Module类似 创建一个类去继承IHttpHandler接口,并实现接口. 在Proce