zoukankan      html  css  js  c++  java
  • 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进行处理的

    image

    HttpModule与HttpHandler概念

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

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

    应用程序。

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

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

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

    image

    下图是我们的调用堆栈

    clip_image001

    第一个被执行的方法是 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() 初始化我们的拦截器

    image

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

    clip_image001[4]

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

    clip_image002

    这里需要注意获取handler的类

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

    clip_image003

    clip_image004

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

    clip_image005

    => 管道流结束

  • 相关阅读:
    WebService 创建
    SAP WebService 概览
    Web Dynpro 架构
    Web Dynpro 配置
    ALE 概览
    Web Dynpro 概览
    IDOC 概览
    WebService 调用
    Windows Server 2016 域控制器搭建NTP服务,并分发NTP策略
    在ESXi 7.0中安装 MacOS Monterey
  • 原文地址:https://www.cnblogs.com/LiangSW/p/5815821.html
Copyright © 2011-2022 走看看