`

.net文件请求iis的回话的工作原理

阅读更多
我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net。他们耐心、细致地告诉你如何一步步拖放控件、设置控件属性、编写CodeBehind代码,以实现某个特定的功能。

       这种做法,实际上是回答了“如何去做”的问题,却没有回答“为什么可以这样做”的问题。

       尽管我很推崇 悉江华 先生的《圣殿祭祀的Asp.Net开发详解》一书,但当我翻看了一下其对角色(Role) 和 用户(Member)的讲解时,我决定跳过去直接读后面的章节。因为我发现他也随了大流,对这部分的讲解停留在“如何去做”的层面上。我相信像悉先生 这样的牛人是不可能不了解底层运作原理的,仅仅是因为那本书原本就已经很厚了吧。

        当你按“如何去做”所讲解的内容去开发程序的时候,对于你的用户,你仍是一名程序员;但对于实现了MembershipProvider 和 RoleProvider 抽象类的微软开发人员来说,你已经成了他们的一个用户。

 

        你可能觉得了解这些幕后工作是如何运作的无关紧要,作为程序员的你只要保证开发出的程序可以高效地运行就可以了。然而,在开发过程中,你却发现常常需要使用诸如 HttpContext 这样的类。这个时候,你可曾思考过这些类的构成和类的实体是如何创建的?你可能简单地回答:HttpContext代表当前请求的一个上下文环境。可你又知道IIS 、Framework、Asp.Net 是如何协同工作处理每个Http请求、如何区分不同的请求、IIS、Framework、Asp.Net三者之间的数据如何流动么?

回答上面这些问题,首先需要了解IIS是如何处理页面请求的,这也是理解 Form验证模式和Windows 验证模式 的基础。

Http请求刚刚到达服务器的时候

当服务器接收到一个 Http请求的时候,IIS 首先需要决定如何去处理这个请求(NOTE:服务器处理一个.htm页面和一个.aspx页面肯定是不一样的么)。那IIS依据什么去处理呢?―― 根据文件的后缀名。

服务器获取所请求的页面(NOTE:也可以是文件,比如 jimmy.jpg)的后缀名以后,接下来会在服务器端寻找可以处理这类后缀名的应用程序,如果IIS找不到可以处理此类文件的应用程序,并且这个文件也没有受到服务器端的保护(NOTE:一个受保护的例子就是 App_Code中的文件,一个不受保护的例子就是你的js脚本),那么IIS将直接把这个文件返还给客户端。

能够处理各种后缀名的应用程序,通常被称为 ISAPI 应用程序(NOTE:Internet Server Application Programe Interface,互联网服务器应用程序接口)。虽然这 ISAPI 听上去还挺气派,也算是“应用程序”呢,但仔细看看它的全称就明白了:它实际上只是一个接口,起到一个代理的作用,它的主要工作是映射所请求的页面(文件) 和与此后缀名相对应的实际的处理程序。

让我们更进一步地看一下 ISAPI ,看看它到底是什么样子,请按下面的步骤进行:

  1. 打开IIS。
  2. 选择随意一个站点,鼠标右键,“属性”。
  3. 选择“主目录”选项卡。
  4. 选择“配置”。

你应该会看到如下的画面:

图1. 应用程序配置

很清楚地就可以看到,所有IIS所能处理,或者叫 ISAPI 所提供代理服务的 文件类型 及其相对应的实际的后台处理程序都在这里清楚地列出来了。

我们找到 .aspx 的应用处理程序,然后点“编辑”,会出现下面的画面:

图2. 编辑.aspx文件的处理程序

 

一路看到这里,可以看出,所有的.aspx文件实际上都是由 aspnet_isapi.dll 这个程序来处理的,当IIS把对于.aspx页面的请求提交给了aspnet_isapi.dll以后,它就不再关心这个请求随后是如何处理的了。现在我们应该知道:Asp.Net 只是服务器(IIS)的一个组成部分而已,它是一个 ISAPI扩展。

这里需要注意两点:

  • 当你修改“限制为”后,可以限制页面(文件)只能以某种特定方式访问
  • “确认文件是否存在”是实现 URL 地址映射的关键选项,我以后会专门讲述。

理解宿主环境(Hosting)

从本质上讲,Asp.Net 主要是由一系列的类组成,这些类的主要目的就是将Http请求转变为对客户端的响应。HttpRuntime类是Asp.Net的一个主要入口,它有一个称作 ProcessRequest 的方法,这个方法以一个 HttpWorkerRequest 类作为参数。HttpRuntime 类几乎包含着关于单个 Http请求的所有信息:所请求的文件、服务器端变量、QueryString、Http 头信息 等等。Asp.Net 使用这些信息来加载、运行正确的文件,并且将这个请求转换到输出流中,一般来说,也就是HTML页面。

NOTE:卸载也是为了重新加载),Http请求被分放在相互隔离的应用程序域中。

对于IIS来说,它依赖一个叫做 HTTP.SYS 的内置驱动程序来监听来自外部的 HTTP请求。在操作系统启动的时候,IIS首先在HTTP.SYS中注册自己的虚拟路径。

如果请求的是一个可访问的URL,HTTP.SYS会将这个请求交给 IIS 工作者进程。

每个工作者进程都有一个身份标识 以及 一系列的可选性能参数。

接下来进行的事情就是上一章节讲述的 ISAPI 了。

 

除了映射文件与其对应的处理程序以外,ISAPI 还需要做一些其他的工作:

  1. 从HTTP.SYS中获取当前的Httq请求信息,并且将这些信息保存到 HttpWorkerRequest 类中。
  2. 在相互隔离的应用程序域AppDomain中加载HttpRuntime。
  3. 调用 HttpRuntime的ProcessRequest方法。

接下来才是程序员通常编写的代码所完成的工作了,然后,IIS 接收返回的数据流,并重新返还给 HTTP.SYS,最后,HTTP.SYS 再将这些数据返回给客户端浏览器。

OK,现在你看到张子阳的空间主页了。

图3.Asp.Net 的宿主环境

理解管道(Pipeline)

在前面两章中,我们在一个相对比较低的层次上讨论了从发出Http请求到看到浏览器输出这转瞬即逝的十分之一秒内IIS和 Framework 所做的事情。但是我们忽略了一个细节:程序员编写的代码是如何在这一过程中衔接的,本章我们就来看看这个问题。

当Http请求进入 Asp.Net Runtime以后,它的管道由托管模块(NOTE:Managed Modules)和处理程序(NOTE:Handlers)组成,并且由管道来处理这个 Http请求。

图4. 理解 Http 管道

我们按编号来看一下这幅图中的数据是如何流动的。

1. HttpRuntime将Http请求转交给 HttpApplication,HttpApplication代表着程序员创建的Web应用程序。HttpApplication创建针对此Http请求的 HttpContext对象,这些对象包含了关于此请求的诸多其他对象,主要是HttpRequest、HttpResponse、HttpSessionState等。这些对象在程序中可以通过Page类或者Context类进行访问。、

2. 接下来Http请求通过一系列Module,这些Module对Http请求具有完全的控制权。这些Module可以做一些执行某个实际工作前的事情

3. Http请求经过所有的Module之后,它会被HttpHandler处理。在这一步,执行实际的一些操作,通常也就是.aspx页面所完成的业务逻辑。可能你会觉得在创建.aspx页面并没有体会到这一过程,但是,你一定知道,.aspx 页面继承自Page类,我们看一下Page类的签名:


    // 代码省略
}

可以看到,Page类实现了IHttpHandler接口,HttpHandler也是Http请求处理的最底层。

4.HttpHandler处理完以后,Http请求再一次回到Module,此时Module可以做一些某个工作已经完成了之后的事情。

 

如果我们将注意力只集中在Http请求、HttpHandler和HttpModule上,不去考虑HttpContext和HttpApplication,那么图4.可以简化成下面这样:

图5.Http请求在HttpHandler 和 HttpModule 中的流动方向

总结

本文中,我首先概要介绍了这系列文章将要为大家讲述的主题。然后,我提出了部分程序员存在的一个问题:在一个比较高的层次上学习和使用Asp.Net。

随后,我以一个访问我个人空间首页的例子,引出了本文主要讲述的三个内容:

  1. Http请求刚刚到达时IIS时,IIS 所做的工作。
  2. Http请求的宿主环境。
  3. Http管道。 
分享到:
评论

相关推荐

    挤塑板生产用造型机sw18_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    挤塑板生产用造型机sw18_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    轿厢式电梯sw12可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    轿厢式电梯sw12可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    thai-scalable-waree-fonts-0.6.5-1.el8.x64-86.rpm.tar.gz

    1、文件说明: Centos8操作系统thai-scalable-waree-fonts-0.6.5-1.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf thai-scalable-waree-fonts-0.6.5-1.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm

    永磁同步电机二阶自抗扰控制仿真:速度环与电流环合并的线性及非线性研究

    内容概要:本文详细探讨了永磁同步电机(PMSM)中二阶自抗扰控制(ADRC)的应用,特别是将速度环和电流环合并的设计。文中介绍了ADRC的核心组件,包括跟踪微分器(TD)、扩张状态观测器(ESO)和非线性状态误差反馈控制律(NLSEF),并通过具体的Python和Matlab代码展示了这些组件的工作原理。此外,文章讨论了线性和非线性ADRC在合并控制中的实现及其优缺点,并强调了在Simulink建模时需要注意的技术细节。通过这种方式,ADRC能够显著提高电机的动态性能和抗干扰能力,尤其在面对复杂工况时表现更为突出。 适合人群:从事电机控制系统设计的研究人员和技术工程师,尤其是对自抗扰控制感兴趣的读者。 使用场景及目标:适用于需要提高永磁同步电机控制精度和效率的实际工程项目,旨在帮助读者理解和掌握ADRC的基本原理及其在速度环和电流环合并控制中的应用。 其他说明:文章不仅提供了理论解释,还包括了大量的代码片段和仿真技巧,有助于读者在实践中验证和优化控制策略。

    电子封装材料仿真:焊料材料仿真.zip

    电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。

    《毛毛虫的袜子》伴奏.mp3

    《毛毛虫的袜子》伴奏.mp3

    【电子设计竞赛】电赛全面指南:竞赛流程、参赛要求与常见问题解答文档的主要内容

    内容概要:电子设计竞赛(电赛)是旨在培养学生创新能力、实践能力和团队合作精神的科技竞赛。文章详细介绍了电赛的目的、流程、参赛要求及常见问题解答。竞赛目的在于通过解决实际问题激发创新思维、提升实践技能、增强团队合作和促进学术交流。竞赛流程分为报名、准备、竞赛、评审和颁奖五个阶段。参赛要求包括团队组成(3-5名学生,可跨专业组队)、配备指导老师、选择符合规定的项目主题以及确保作品符合技术规范。常见问题解答涵盖参赛专业限制、所需准备材料、评审标准和培训指导等方面; 适合人群:对电子技术感兴趣并希望提升自身能力的大学生; 使用场景及目标:①为有意参赛的学生提供详细的参赛指南;②帮助学生了解竞赛流程和要求,提前做好充分准备; 阅读建议:本文为有意参加电赛的学生提供了全面的信息和指导,读者应重点关注竞赛流程、参赛要求及评审标准等内容,以便更好地准备竞赛。

    自然语言处理系列-安装nltk-data和punkt库

    NLTK 是一个广泛使用的 Python 库,专注于自然语言处理(NLP)。它提供了许多工具和算法来处理文本数据,例如分词、词性标注、句法分析等。然而,这些功能通常需要依赖大量的语言数据(如语料库、词典、预训练模型等),这些数据被统称为 NLTK 数据资源 。 主要内容: a. 语料库(Corpora) 这些是用于训练和测试 NLP 模型的文本数据集合。 示例:gutenberg(古登堡计划的书籍)、brown(布朗语料库)、reuters(路透社新闻语料库)等。 b. 词典与词汇资源(Lexical Resources) 包括词频表、同义词词典(如 WordNet)、停用词列表等。 示例:wordnet(WordNet 同义词数据库)、stopwords(多语言停用词列表)。 c. 预训练模型(Pre-trained Models) 包含一些常用的 NLP 模型,例如分词器、词性标注器、命名实体识别器等。 示例:punkt(用于句子分割的预训练模型)、averaged_perceptron_tagger(词性标注器)。 d. 其他资源 包括一些辅助工具和配置文件,用于支持 NLTK 的各种功能。

    【Python编程】Python爬虫基础教程:网络数据抓取与解析流程及应用实例

    内容概要:本文介绍了Python爬虫的基础知识,包括定义、优势、基本流程、常用库以及注意事项。爬虫是一种自动抓取网页信息的程序,Python因其简洁的语法、强大的库支持和跨平台特性成为爬虫开发的理想选择。文章详细讲解了爬虫的基本流程:发送请求、解析内容、存储数据和异常处理,并列举了requests、BeautifulSoup、Scrapy、lxml等常用库的功能。最后给出一个简单示例演示爬取网页标题的过程,同时强调了遵守robots.txt协议、设置合理请求间隔、处理反爬虫机制等注意事项。; 适合人群:对Python爬虫感兴趣的初学者或有一定编程基础的技术人员。; 使用场景及目标:①了解爬虫的工作原理和应用场景;②掌握Python爬虫的基本开发流程和常用库的使用方法;③能够编写简单的爬虫程序,为后续的数据分析、机器学习等任务提供数据支持。; 阅读建议:读者应结合实际案例进行练习,在理解理论的同时注重实践操作,确保能灵活运用所学知识。

    西门子PLC博途V17与WinCC 7.5sp2高效工程模板:多重背景编程与结构变量应用

    内容概要:本文详细介绍了基于西门子PLC博途V17和WinCC 7.5sp2的一套高效工程模板。博途部分利用多重背景技术和梯形图+SCL混合编程,极大提升了编程效率和维护简便性。WinCC部分通过结构变量和面板实例,简化了人机界面的组态工作。此外,模板还包括丰富的功能库如PID控制、语音报警、报表生成功能等,显著增强了系统的实用性和用户体验。 适合人群:自动化领域的工程师和技术人员,尤其是初学者和有一定经验但仍需提高效率的从业者。 使用场景及目标:适用于工业自动化项目的快速开发与部署,旨在减少重复劳动,提高开发效率,缩短项目周期。通过使用该模板,工程师能够更快地上手并掌握先进的编程技巧和组态方法。 其他说明:文中提供了具体的代码示例和实际应用场景,有助于读者更好地理解和应用这些技术。同时提醒用户注意版权和使用权限的问题。

    工作簿7777.xlsx

    工作簿7777.xlsx

    立式插秧机sw16可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    立式插秧机sw16可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    稳压罐sw16_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    稳压罐sw16_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip

    电气设备故障仿真:开关设备故障仿真.zip

    电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。

    电路仿真:电路优化设计.zip

    电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。

    【JavaWeb详解-Interceptor】基于SpringMVC的Interceptor拦截器

    内容概要:文章详细介绍了拦截器(Interceptor)的工作机制及其在HTTP请求响应全流程中的作用,包括在请求到达目标处理器之前、处理器处理请求之后以及视图渲染之前执行特定操作。拦截器的应用广泛,如日志记录、权限控制、性能监控、请求参数处理和身份验证与授权等。文中还提供了创建拦截器的方法,可以通过实现`HandlerInterceptor`接口或继承`HandlerInterceptorAdapter`类来创建,并且展示了如何配置拦截器,将其添加到配置中以拦截所有请求,还可以通过`@Order`注解配置拦截器的执行顺序。多个拦截器按照配置顺序依次执行其`preHandler`、`postHandler`和`afterCompletion`方法,确保请求处理流程的有序性和灵活性。 适合人群:具有一定Java Web开发经验,尤其是熟悉Spring框架的开发者。 使用场景及目标:①理解拦截器在Web应用中的工作原理;②掌握如何创建和配置拦截器以实现特定功能;③学习如何利用拦截器实现如日志记录、权限控制等功能,提升Web应用的安全性和性能。 阅读建议:在学习过程中,应结合实际项目需求,理解每个拦截器方法的作用,并尝试在自己的项目中实现相应的拦截器,以加深对其工作机制的理解。

    基于Matlab的预测不确定性仿真:置信区间计算与可视化

    内容概要:本文详细介绍了如何使用Matlab进行预测不确定性的仿真,重点讲解了置信区间的计算方法及其可视化。文章通过具体的代码示例展示了如何计算区间覆盖率(PICP)和区间平均宽度百分比,并提供了多种优化技巧,如使用norminv函数计算正态分布分位数、动态计算标准差以及分位数回归等。此外,还分享了一些常见的错误和改进建议,帮助新手快速掌握这一技能。 适合人群:初学者和有一定编程基础的Matlab用户,特别是那些希望深入了解预测不确定性和置信区间计算的人。 使用场景及目标:① 学习如何使用Matlab进行预测不确定性的仿真;② 掌握置信区间的计算方法及其可视化;③ 提高预测模型的可靠性和准确性。 其他说明:文中提供的代码可以直接应用于实际数据,只需替换示例数据即可。同时,文中还提到了一些高级技巧,如动态标准差计算和分位数回归,可以帮助用户进一步优化预测模型。

    【电子信息技术】电子硬件课后习题总结:从电路分析到题型掌握的解题策略与学习方法指导涵盖了电子硬件课

    内容概要:本文旨在帮助电子信息、自动化、通信等专业学生更好地理解和完成电子硬件课后习题。文章首先指出电子硬件课程的难度,特别是课后习题部分。接着详细介绍了四个主要方面的解题技巧:一是正确理解电路图,强调在分析电路时要先明确电路特性再进行计算;二是利用等效变换简化电路,通过戴维南定理等方法将复杂电路转化为简单结构;三是总结常考题型,如RC、RL电路分析、放大电路分析等,并给出解题关键词;四是强调动手实践与理论思考相结合,鼓励使用仿真软件和实际搭建电路来增强理解。最后提出学习建议,包括多画图、分类练习、与同学交流等,以提高学习效率。 适合人群:电子信息、自动化、通信等相关专业的学生,尤其是正在学习电子硬件课程的学生。 使用场景及目标:①帮助学生克服电子硬件课程中遇到的困难,特别是课后习题部分;②提高学生对电路分析、等效变换等基本概念的理解和应用能力;③培养学生的动手能力和解决实际问题的能力。 阅读建议:本文提供了丰富的解题技巧和学习建议,读者应结合自身学习情况,边读边思考,并尝试将文中提到的方法应用于实际练习中,以达到更好的学习效果。

    汽车电子基于ISO14229的ECU刷写架构中重复blockSequenceCounter数据包处理机制设计:确保数据传输鲁棒性和协议合规性

    内容概要:本文探讨了车载刷写架构中 ECU 收到相同 blockSequenceCounter 数据包的情况,基于 ISO14229 标准,详细解释了 UDS 诊断服务(特别是 34、36 和 37 服务)在 ECU 刷写过程中的作用。文章重点分析了 TransferData 服务(SID 0x36)的实现逻辑,包括 blockSequenceCounter 的状态管理和重复数据包处理机制,以确保数据传输的鲁棒性和协议合规性。通过合理的状态管理和计数器递增逻辑,避免了数据覆盖或丢失,并提高了 ECU 存储寿命。 适合人群:具有汽车电子相关背景的研发工程师和技术人员,尤其是从事 ECU 诊断刷写工作的专业人士。 使用场景及目标:①理解 UDS 诊断服务在 ECU 刷写中的具体应用,特别是 34、36 和 37 服务的作用;②掌握 blockSequenceCounter 的状态管理和重复数据包处理机制,确保数据传输的可靠性;③确保 ECU 刷写过程符合 ISO 14229 标准,提高系统鲁棒性和资源效率。 其他说明:文章提供了详细的测试用例设计,帮助开发者验证 ECU 对重复包的处理是否符合预期。同时强调了在重复包场景中确保无冗余写入操作的重要性,尤其是在 Flash 存储中避免擦写寿命损耗。此外,还提到了超时处理和错误恢复机制,以应对实际应用中的各种情况。

    c语言奔跑的火柴人游戏源码.zip

    c语言奔跑的火柴人游戏源码.zip

Global site tag (gtag.js) - Google Analytics