当前位置: 首页 > news >正文

.NET运行机制

.NET框架是一个多语言组件开发和执行环境,它提供了一个跨语言的统一编程环境。.NET框架的目的是便于开发人员更容易地建立Web应用程序和Web服务,使得Internet上的各应用程序之间,可以使用Web服务进行沟通。从层次结构来看,.NET框架又包括三个主要组成部分:公共语言运行时(CLR:Common Language Runtime)、服务框架(Services Framework)和上层的两类应用模板——传统的Windows应用程序模板(Win Forms)和基于ASP NET的面向Web的网络应用程序模板(Web Forms和Web Services)。公共语言运行时(CLR),是一个运行时环境,管理代码的执行并使开发过程变得更加简单。

.NET Framework 具有两个主要组件:公共语言运行库和 .NET Framework 类库。

公共语言运行库是 .NET Framework 的基础。您可以将运行库看作一个在执行时管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。事实上,代码管理的概念是运行库的基本原则。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。

类库是一个综合性的面向对象的可重用类型集合,您可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面 (GUI) 应用程序,也包括基于 ASP.NET 所提供的最新创新的应用程序(如 Web 窗体和 XML Web services)。

下面的插图显示公共语言运行库和类库与应用程序之间以及与整个系统之间的关系。该插图还显示托管代码如何在更大的结构内运行。

受托管的代码不能直接写内存,是安全的,而非托管代码是非安全代码,可以使用指针操作内存。

一般的项目使用托管代码都行了,也就是说在程序里面不需要用到非安全代码。

对于一些对速度要求高的部分功能可以考虑使用非安全代码,使用指针等读写内存,而对于真个项目来说还是受托管的安全代码。
 

我们看一看.NET Framework运行机制和架构。

在开始之前,我们先跟随考古学家参观一下古老的ASP运行机制:

当你请求一个*.asp文件的时候,这个http request首先被inetinfo.exe进程所截获,这个inetinfo.exe进程就是WWW服务进程,然后她会将这个请求转交给 asp.dll进程,asp.dll进程就会解释执行这个asp叶面,然后将解释后的数据流返回给客户端浏览器。

转过头来我们看看如今的.NET Framework运行机制是如何处理一个http request.

当你请求一个*.aspx文件的时候,同样的这个http request会被inetinfo.exe进程截获,她判断文件的后缀之后,将这个请求转交给 ASPNET_ISAPI.dll,ASPNET_ISAPI.dll会通过一个被称为Http PipeLine的管道,将请求发送给ASPNET_WP.exe进程,当这个http request进入ASPNET_WP.exe进程之后,会通过HttpRuntime来处理这个请求,处理完毕将结果返回客户端。

当Http Request进入HttpRuntime之后,会继续进入到一个被称之为HttpApplication Factory的一个Container中,她会给出一个HttpApplication来处理传递进来的请求,这个请求会依次进入如下几个 Container:

HttpModule->HttpHandler Factory->HttpHandler。

当系统内部的HttpHandler的ProcessResquest方法处理完毕之后,整个Http Request就完成了,客户端也就得到相应的东东了。

整理一下ASP.NET Framework处理一个Http Request的流程:

HttpRequest-->inetinfo.exe-->ASPNET_ISAPI.dll-->Http Pipeline-->ASPNET_WP.exe-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()

注:

inetinfo.exe:

是Windows本身的一个系统进程。Windows用这个程序提供IIS服务,也就是说,当你机器中运行了这个程序,其他用户理论上可以把你的计算机当作一个网站来访问。
ASPNET_ISAPI.dll:
ISAPI缩写词=Internet Server Application Programming Interface ,网络服务应用程序接口。iis的一部分。供http服务器调用的DLL程序集 aspnet_isapi.dll 当用户请求一个aspx文件时,IIS会把这个请求交给.NET framework处理,fw会解析反射调用你写好的cs代码,然后在把返回的数据交给IIS,在IIS的网站上右键属性-主目录-配置-映射 里面 扩展名.aspx 文件被映射到aspnet_isapi.dll上
aspnet_wp.exe进程:
ASP.NET框架进程,提供.net运行的托管环境,.net的CLR(公共语言运行时)就是寄存在此进程中。
HttpRuntime
为当前应用程序提供一组 ASP.NET 运行时服务

HttpRuntime 对象在处理 HTTP 请求的 ASP.NET 管线模型的开头使用。ProcessRequest 方法驱动所有后续的 ASP.NET Web 处理。

网页开发人员可以使用 HttpRuntime 类属性来查找关于当前应用程序域的信息,例如用于诊断目的。创建自定义进程管线或自定义宿主环境的开发人员应该在从 HttpWorkerRequestSimpleWorkerRequest 类派生的类中调用 ProcessRequest 方法。

HttpApplication Factory和HttpApplication

HttpApplication对象是经由HttpApplicationFactory.GetApplicationInstance(并最终调用HttpRuntime.CreateNonPublicInstance)创建的HttpApplicationFactory它的主要任务是使用 URL 信息来查找 URL 虚拟目录和汇集的 HttpApplication 对象之间的匹配关系。

HttpModuleHttpHandler

ASP.NET请求处理过程是基于管道模型的,这个管道模型是由多个HttpModule和HttpHandler组成,ASP.NET把http请求依次传递给管道中各个HttpModule,最终被HttpHandler处理,处理完成后,再次经过管道中的HTTP模块,把结果返回给客户端。我们可以在每个HttpModule中都可以干预请求的处理过程。

转载于:https://www.cnblogs.com/TNSSTAR/archive/2012/08/24/2653844.html

相关文章:

  • delphi中保留字的属性和含义
  • “开-闭”原则(OCP)(Java与模式笔记)
  • [C#]DataTable常用操作总结【转】
  • JdbcTemplate查询数据 三种callback之间的区别
  • asp.net 伪静态 IIS设置后 直正HTML无法显示
  • 适配器模式(Adapter)
  • GBK
  • 学习ADO时总结的一些经验
  • sysconf zz
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • Linux的nm查看动态和静态库中的符号
  • 产品验证环节的失语现象
  • LDR指令的应用
  • iptables应用
  • 天啊,原来计算机就是佛,信则灵
  • [Vue CLI 3] 配置解析之 css.extract
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • android 一些 utils
  • Debian下无root权限使用Python访问Oracle
  • Effective Java 笔记(一)
  • express如何解决request entity too large问题
  • Gradle 5.0 正式版发布
  • IP路由与转发
  • JavaScript创建对象的四种方式
  • js中的正则表达式入门
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • ucore操作系统实验笔记 - 重新理解中断
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 动态规划入门(以爬楼梯为例)
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 试着探索高并发下的系统架构面貌
  • 王永庆:技术创新改变教育未来
  • 为视图添加丝滑的水波纹
  • 项目管理碎碎念系列之一:干系人管理
  • 追踪解析 FutureTask 源码
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • Java性能优化之JVM GC(垃圾回收机制)
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​香农与信息论三大定律
  • ​学习一下,什么是预包装食品?​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #传输# #传输数据判断#
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二)linux使用docker容器运行mysql
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (四)Controller接口控制器详解(三)
  • (转)Oracle存储过程编写经验和优化措施
  • ****Linux下Mysql的安装和配置