MVC系列(3) HttpRuntime详解分析(下)

文章内容

话说,经过各种各样复杂的我们不知道的内部处理,非托管代码正式开始调用ISPAIRuntime的 ProcessRequest方法了(ISPAIRuntime继承了IISPAIRuntime接口,该接口可以和COM进行交互,并且暴露了 ProcessRequest接口方法)。至于为什么要调用这个方法,大叔也不太清楚,找不到微软相关的资料哦。但大叔确定该方法就是我们进入 HttpRuntime的正式大门,接着看吧。

public int ProcessRequest(IntPtr ecb, int iWRType) {  

    IntPtr pHttpCompletion = IntPtr.Zero;  

    if (iWRType == WORKER_REQUEST_TYPE_IN_PROC_VERSION_2) {  

        pHttpCompletion = ecb;  

        ecb = UnsafeNativeMethods.GetEcb(pHttpCompletion);  

    }  

    ISAPIWorkerRequest wr = null;  

    try {  

        bool useOOP = (iWRType == WORKER_REQUEST_TYPE_OOP);  

        wr = ISAPIWorkerRequest.CreateWorkerRequest(ecb, useOOP);  

        wr.Initialize();  

        // check if app path matches (need to restart app domain?)  

        String wrPath = wr.GetAppPathTranslated();  

        String adPath = HttpRuntime.AppDomainAppPathInternal;  

        if (adPath == null ||  

            StringUtil.EqualsIgnoreCase(wrPath, adPath)) {   

            HttpRuntime.ProcessRequestNoDemand(wr);  

            return 0;  

        }  

        else {  

            // need to restart app domain  

            HttpRuntime.ShutdownAppDomain(ApplicationShutdownReason.PhysicalApplicationPathChanged,  

                                            SR.GetString(SR.Hosting_Phys_Path_Changed,  

                                                                            adPath,  

                                                                            wrPath));  

            return 1;  

        }  

    }  

    catch(Exception e) {  

        try {  

            WebBaseEvent.RaiseRuntimeError(e, this);  

        } catch {}  

        // Have we called HSE_REQ_DONE_WITH_SESSION?  If so, don't re-throw.  

        if (wr != null && wr.Ecb == IntPtr.Zero) {  

            if (pHttpCompletion != IntPtr.Zero) {  

                UnsafeNativeMethods.SetDoneWithSessionCalled(pHttpCompletion);  

            }  

            // if this is a thread abort exception, cancel the abort  

            if (e is ThreadAbortException) {  

                Thread.ResetAbort();  

            }  

            // IMPORTANT: if this thread is being aborted because of an AppDomain.Unload,  

            // the CLR will still throw an AppDomainUnloadedException. The native caller  

            // must special case COR_E_APPDOMAINUNLOADED(0x80131014) and not  

            // call HSE_REQ_DONE_WITH_SESSION more than once.  

            return 0;  

        }   

        // re-throw if we have not called HSE_REQ_DONE_WITH_SESSION  

        throw;
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索接口
, 方法
, if
IntPtr
springmvc注解详解、spring mvc.xml详解、spring mvc详解、spring mvc原理详解、spring4 mvc配置详解,以便于您获取更多的相关知识。

时间: 2024-09-28 16:06:44

MVC系列(3) HttpRuntime详解分析(下)的相关文章

MVC系列(2) HttpRuntime详解分析(上)

文章内容 从上章文章都知道,asp.net是运行在HttpRuntime里的,但是从CLR如何进入HttpRuntime的,可能大家都不太清晰.本章节就是通过深入分析.Net4的源码来展示其中的重要步骤.请先看下图: 首先,CLR在初始化加载的时候,会加载一个非常重要的类AppManagerAppDomainFactory,这个类是做什么用的呢?首先这个类继承了IAppManagerAppDomainFactory接口,而这个接口是是有个可供COM调用的Create方法,代码如下: [ComIm

《Ansible权威指南》一2.4 Ansible系列命令用法详解与使用场景介绍

2.4 Ansible系列命令用法详解与使用场景介绍 如何获取Ansible的系列命令呢?在终端键入ansible后连续按两次Tab键,会补全所有以ansible字母开头的命令,这些命令均是Ansible系列命令.本节我们来逐一介绍Ansible的系列命令使用. ansible ansible-galaxy ansible-pull ansible-doc ansible-playbook ansible-vault ansible-console 2.4.1 ansible 命令ansible

AngularJS tab栏实现和mvc小案例实例详解

tab栏: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Tab 标签</title> <style> body { margin: 0; padding: 0; background-color: #F7F7F7; } .tabs { width: 400px; margin: 3

ASP.NET MVC Controller激活系统详解:总体设计

我们将整个ASP.NET MVC框架划分为若干个子系统,那么针对请求上下文激活目标Controller对象的子系统被我们成为Controller激活系统.在正式讨论Controller对象具体是如何被创建爱之前,我们先来看看Controller激活系统在ASP.NET MVC中的总体设计,了解一下组成该子系统的一些基本的组件,以及它们对应的接口或者抽象类是什么. 一.Controller 我们知道作为Controller的类型直接或者间接实现了IController接口.如下面的代码片断所示,I

Android组件系列----Activity组件详解

[正文] 注:四大组件指的是应用组件:Activity.Service.BroadcastReceiver.ContentProvider:之前的控件指的是UI组件. 博文目录: 一.Activity简介 二.Activity的状态和生命周期 三.Activity的基本用法 四.向下一个Activity传递数据 五.返回数据给上一个Activity 六.Activity运行时屏幕方向与显示方式 七.Activity的现场保存 八.Activity通过SharedPreferences保存数据 一

spring mvc 框架搭建及详解

现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不过要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理. 一.Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar.spring-webmvc.jar.comm

Android SwipeMenuListView框架详解分析_Android

周末 特地把Android SwipeMenuListView(滑动菜单)的知识资料整理一番,以下是整理内容: SwipeMenuListView(滑动菜单) A swipe menu for ListView.--一个非常好的滑动菜单开源项目. Demo  一.简介 看了挺长时间的自定义View和事件分发,想找一个项目练习下..正好印证自己所学. 在github上找到了这个项目:SwipeMenuListView这的真不错,对事件分发和自定义View都很有启发性,虽然还有点小瑕疵,后面说明.想

实例详解Linux下的Make命令_Linux

前言 无论是在linux 还是在Unix环境 中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和 makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系.而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员 来说简直就是一场灾难.而make工具则可自动完成编译

详解linux下make命令的使用方法_Linux

本文我们将用一些实例来讨论 make 命令背后的工作机制. Make 如何工作的 对于不知道背后机理的人来说,make 命令像命令行参数一样接收目标.这些目标通常存放在以 "Makefile" 来命名的特殊文件中,同时文件也包含与目标相对应的操作.更多信息,阅读关于 Makefiles 如何工作的系列文章. 当 make 命令第一次执行时,它扫描 Makefile 找到目标以及其依赖.如果这些依赖自身也是目标,继续为这些依赖扫描 Makefile 建立其依赖关系,然后编译它们.一旦主依