httpRuntime与ASP.NET 运行时及IIS处理模型

配置 ASP.NET HTTP 运行时设置,以确定如何处理对 ASP.NET 应用程序的请求,配置节及其描述如下所示。

<httpRuntime

executionTimeout="110"--------------------------指定在被 ASP.NET 自动关闭前,允许执行请求的最大秒数

maxRequestLength="4096"--------------------------指定输入流缓冲阈值限制(以 KB 为单位)。此限制可用于防止拒绝服务攻击;例如,因用户向服务器发送大型文件而导致的拒绝服务攻击。

requestLengthDiskThreshold="256"--------------------------定输入流缓冲阈值限制(以字节为单位)。该值不应超过 maxRequestLength 属性。

useFullyQualifiedRedirectUrl="false"

minFreeThreads="8"--------------------------请求时空闲时最小线程数

minLocalRequestFreeThreads="4"--------------------------本地请求时最小的空闲线程数

appRequestQueueLimit="5000"--------------------------指定 ASP.NET 将为应用程序排队的请求的最大数目。当没有足够的自由线程来处理请求时,将对请求进行排队。当队列超出了该属性中指定的限制时,将通过"503 - 服务器太忙"错误信息拒绝传入的请求。

enableKernelOutputCache="true"--------------------------启用输出缓存 IIS6以后版本生效

enableVersionHeader="true"--------------------------是否在头部输出版本

requireRootedSaveAsPath="true"--------------------------指定 SaveAs 方法中的 filename 参数是否必须为绝对路径。ASP.NET 进程必须具有在指定位置中创建文件的权限。

enable="true"--------------------------相当于关闭应用程序(连静态页面也无法访问)指定是否在当前的节点及子节点级别启用应用程序域 (AppDomain),以接受传入的请求。如果为 False,则实际上关闭了该应用程序

shutdownTimeout="90"--------------------------关闭超时单位 秒 指定允许辅助进程关闭的分钟数。在达到该超时时间时,ASP.NET 关闭辅助进程。

delayNotificationTimeout="5"--------------------------延迟通知超时时间 秒为单位

waitChangeNotification="0"--------------------------等待变更通知

maxWaitChangeNotification="0"--------------------------最大等待变更通知数

requestPriority="Normal"--------------------------请求策略

enableHeaderChecking="true"--------------------------启用头部检查 以检测可能的注入式攻击。如果检测到攻击,ASP.NET 将返回错误作为响应。

sendCacheControlHeader="true"--------------------------指定是否发送默认情况下设置为 Private 的缓存控制标头。如果为 True,则客户端缓存被禁用。

apartmentThreading="false"-----------启用单元线程处理以实现传统的 ASP 兼容性。

/>

从上面的特性而言大概概括成HttRuntime的自身运行方面(包括重启时间,线程数控制,请求队列),请求头限制响应输出。

而HttpRuntime还涉及到其他方面,如Http管道,IIS的运行模型。有其他博文从代码角度列举了从一个请求到达后,在AppDomain中创建HttpRuntime,HttpContext,HttpApplication,各个HttpModule,到HttpHandler处理。

舍长的《深入理解ASP.NET的内部运行机制》

此外之前在看Http管道时一直没仔细去搞清楚IIS的处理模型,在此也补一补。IIS到我现在看为止已经到了7.0的版本,网上有不少资料从5.0开始说起,既然如此就从5.0说起,看看其变迁。

以下图片均摘自蒋金楠老是的著作《ASP.NET MVC 4 框架揭秘》

IIS5处理模型

IIS 5.x 运行在进程 InetInfo.exe 中,该进程寄宿着一个名为 World Wide Web Publishing Service(简称 W3SVC)的 Windows 服务。 W3SVC 的主要功能包括 HTTP 请求的监听、工作进程和配置管理(通过从 Metabase 中加载相关配置信息)等。

如果我们请求的是一个基于 ASP.NET 的资源类型,比如.aspx、 .asmx 和.svc 等,aspnet_isapi.dll 会被加载,而 ASP.NET ISAPI 扩展会创建 ASP.NET 的工作进程(如果该进程尚未启动)。对于 IIS 5.x 来说,该工作进程为 aspnet.exe。 IIS 进程与工作进程之间通过命名管道( Named Pipes)进行通信。

在工作进程初始化过程中, .NET 运行时( CLR)被加载进而构建了一个托管的环境。对于某个 Web 应用的初次请求, CLR 会为其创建一个应用程序域( Application Domain)。在应用程序域中, HTTP 运行时( HTTP Runtime)被加载并用以创建相应的应用。寄宿于IIS 5.x 的所有 Web 应用都运行在同一个进程(工作进程 aspnet_wp.exe)的不同应用程序域中。

IIS6处理模型

IIS5中有两个弊端,其一是ISAPI与工作进程分离,会存在性能瓶颈;其二是所有ASP.NET应用程序存在于同一个进程中,应用程序间会存在影响。

针对这两个问题,作了两个改进,引入了应用程序池以及把ISAPI放到工作进程中。

此外IIS6中在系统内核层面引入了HTTP.SYS处理监听HTTP请求。其好处是可以持续监听,更好的稳定性和内核模式下数据缓存。Inetinfo.exe单纯用于存储ISAPI的配置信息,W3SVC则寄宿于另一个进程SvcHost.exe中,其内部职能并没有发生任何变化,功能实现做了改进。

IIS7处理模型

在IIS7中引入了 Windows进程激活服务( Windows Process Activation Service, WAS)的引入,将原来( IIS 6.0) W3SVC承载的部分功能分流给了 WAS。实际上是对监听这一环节开放了可扩展的接口。W3SVC还是存储原有的HTTP请求的监听,但这也成为了它唯一的职责,后续的读取ISAPI信息和工作进程管理那块则移交给WAS。扩展的监听接口看介绍是在WCF方面比较有用,现在暂且不关注它。ISAPI的配置信息也不依赖于原有的Metabase,改用了applicationHost.config。

IIS7的集成模式肯定也要提到,在前面介绍httpHandlers的时候也提到IIS7有经典模式和集成模式。IIS7之前是使用双管道处理Http请求,在IIS中有一堆模块处理(例如身份认证),同样在Http管道中有重复的处理。而在IIS7中新增了集成模式可以使得这两个管道处理变成单一管道统一处理。IIS7中同样保留了双管道的处理模式,称之为经典模式。在经典模式中对扩展的HttpModule和HttpHandler只作用于ISAPI扩展过的这些资源,但对静态资源是没有作用的,假设使用了集成模式,因为是单一管道统一处理,不管动态还是静态都会被httpModule和HttpHandler处理。

上面介绍的几个IIS处理模型都是在HttpRuntime生成前,到了.NET Runtime的范围内,HttpRuntime才开始被创建出来。关于如何被生成,如何被调用鄙人则不想再粘贴代码了。想看的话还是那个链接:舍长的《深入理解ASP.NET的内部运行机制》。

以上都是人云亦云的内容,在经峰哥教导后我觉得这样学习就不踏实了,可惜好像还没有任何有效途径去验证这些说法。至少在MSDN上也还没发现相关内容。

时间: 2024-08-03 15:39:36

httpRuntime与ASP.NET 运行时及IIS处理模型的相关文章

HttpRuntime应用程序的运行时

System.Web.HttpRuntime类是整个Asp.net服务器处理的入口. 这个类提供了一系列的静态属性,反映web应用程序域的设置信息,而且每个web应用程序域中存在一个System.Web.Runtime类. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web; using System.Web.UI; using System.

使用生活实例理解Asp.net运行时

学习编程语言,掌握面向对象的编程思想尤为重要,一旦理解了面向对象的这种概念,那么好些地方拿到生活中去理解,就容易的多了.书本上的枯燥干涩的语言,对于好多人来说,即难懂,更难长时间牢牢记得.但是编程语言是为生活服务,也是来源于生活.我们的生活是丰富多彩的,那么,使用生活中的实例来理解编程,一切就容易的多了.下面,我们就用生活中打电话的例子来理解ASP.NET运行时的内部过程: 当请求到达IIS后,IIS通过Aspnet_isapi.dll的作用将请求转交给ASP.NET运行时环境,在Asp.net

在Linux安装ASP.Net Core的运行时(Runtime)

在部署的时候,如果您不想在您的Linux服务器上安装.Net Core SDK,您可以只安装Runtime,接下来我们看看该如何安装运行时Runtime. 下载运行时文件 下载页面:https://www.microsoft.com/net/download/linux 先获取一下对应的下载链接,可以使用浏览器点击链接来获取具体文件的下载链接 获取完链接以后,就可以使用命令下获取和安装了 以Centos 7,Ubuntu 16.04为例安装ASP.Net Core 2.0.5的运行时: wget

Asp.Net Core 发布到IIS

一.Asp.Net Core 发布到IIS 1.许多时候在WindowsServer服务器上已经安装了IIS,监听80端口,那么Asp.Net Core应用的自宿主就没法监听80端口 2.也就是在Widnows系统已经启用IIS服务的情况下,需要安装 NET Core Windows Server Hosting,在目前官方给出的安装包中包含了.Net Core运行时 和Widnows Server  Hosting 3.Asp.Net Core发布到IIS下,需要.NET Core Windo

《转》.NET开源核心运行时,且行且珍惜

转载自infoQ 背景 InfoQ中文站此前报道过,2014年11月12日,ASP.NET之父.微软云计算与企业级产品工程部执行副总裁Scott Guthrie,在Connect全球开发者在线会议上宣布,微软将开源全部.NET核心运行时,并将.NET 扩展为可在 Linux 和 Mac OS 平台上运行..NET核心运行时将基于MIT开源许可协议发布,其中将包括执行.NET代码所需的一切项目——CLR.JIT编译器.垃圾收集器(GC)和核心.NET基础类库.此外,微软还发布了Visual Stu

ASP.NET Thread Usage on IIS 7.5, IIS 7.0, and IIS 6.0

I’d like to briefly explain how ASP.NET uses threads when hosted on IIS 7.5, IIS 7.0 and IIS 6.0, as well as the configuration changes that you can make to alter the defaults. Please take a quick look at the “Threading Explained” section in Chapter 6

[转]Publishing and Running ASP.NET Core Applications with IIS

本文转自:https://weblog.west-wind.com/posts/2016/Jun/06/Publishing-and-Running-ASPNET-Core-Applications-with-IIS#DoyouneedIIS? When you build ASP.NET Core applications and you plan on running your applications on IIS you'll find that the way that Core ap

Java注解(2)-注解处理器(运行时|RetentionPolicy.RUNTIME)

如果没有用来读取注解的工具,那注解将基本没有任何作用,它也不会比注释更有用.读取注解的工具叫作注解处理器.Java提供了两种方式来处理注解:第一种是利用运行时反射机制:另一种是使用Java提供的API来处理编译期的注解. 反射机制方式的注解处理器 仅当定义的注解的@Retention为RUNTIME时,才能够通过运行时的反射机制来处理注解.下面结合例子来说明这种方式的处理方法. Java中的反射API(如java.lang.Class.java.lang.reflect.Field等)都实现了接

Kubernetes(k8s)容器运行时(CRI)

Kubernetes节点的底层由一个叫做"容器运行时"的软件进行支撑,它负责比如启停容器这样的事情.最广为人知的容器运行时当属Docker,但它不是唯一的.事实上,容器运行时这个领域发展迅速.为了使Kubernetes的扩展变得更容易,我们一直在打磨支持容器运行时的K8s插件API:容器运行时接口(Container Runtime Interface, CRI). CRI是什么? 每种容器运行时各有所长,许多用户都希望Kubernetes支持更多的运行时.在Kubernetes 1.