httpHandlers的实例重用

在ASP.net 中,可以编写一个Class 继承IHttpHandler,其中有个IsReusable属性,表示是否可以重用。

我的疑问是:并发时,HttpHandlers可以重用吗?

1 调用原理

HttpHandler的调用原理是HttpApplication的ResumeSteps函数首先算出本请求应该用哪个IHttpHandler实例来执行请求,然后调用IHttpHandler的ProcessRequest方法执行请求。

反射看下源代码:

MapHandlerExecutionStep的Execute函数:

ResumeSteps函数的最后还有一句RecycleHandlers()调用,用来决定下次是否可重用这个IHttpHandler的实例:

根据IsReusable属性的值,决定是否销毁(没销毁,则下次直接使用,销毁了,自然不能重用了)

2 并发多个请求是否可以重用?

ASP.net执行请求的先是HttpApplication,然后由HttpApplication调用IHttpHandler执行ProcessRequest方法。

如果并发多个请求,则会创建多个HttpApplication的实例,这样新的HttpApplication的实例上,并没有Handler的实例缓存,所以会创建新的Handler的实例。

当然,这个2个请求结束后,HttpApplication的实例会被回收重用,下次请求进来,将使用已初始化好的Handler的实例。

3 调试证明:

  1. 准备一个Handler,传入的参数不同,执行不同的动作:
public class MyCallBack : IHttpHandler
{
	public bool IsReusable
	{
		get { return true; }
	}
	public void ProcessRequest(HttpContext context)
	{
		string name = context.Request.QueryString["Method"];
		if (name == "Default") {
			Default();
		}
		else if (name == "Test")
		{
			Test();
		}
		else
		{
		}
	}

	public void Default()
	{
		Thread.Sleep(10000);
		HttpContext.Current.Response.Write("Default");
	}
	public void Test()
	{
		HttpContext.Current.Response.Write("Test");
	}
}

2) 配置到Web.Config

        <httpHandlers>
            <add verb="GET" path="MyCallBack.axd" type="MyCallBack"/>
        </httpHandlers>

3) 启动调试:

第一次请求,实例为:6757235

第二次请求,实例还是:6757235,证明实例是被重用的

第三次请求,实例还是:6757235,继续执行,让它卡住。

同时再发一次请求,结果能顺利命中Test

但是实例变了,原因是这个实例是另外一个HttpApplication 实例创建的。

4结论:

IHttpHandler的实例重用是在HttpApplication的基础上,即便重用,也不能保证整个Web应用程序中只有1个HttpHandler的实例。

如果某个方法执行很久,它不会拖累别的请求,原因是别的请求是在另外一个HttpApplication实例上工作的,当前执行很久的请求并不在同一个实例上。

时间: 2024-11-02 18:12:29

httpHandlers的实例重用的相关文章

Spring的工作原理核心组件和应用

Spring框架 Spring 是管理多个java类的容器框架,注意是类不管理接口. Spring 的主要功能 Ioc 反转控制和 DI 依赖注入. 注入的方式可以是构造函数赋值也可以是 set方法赋值推荐用set方法赋值 在Spring一加载的阶段就实例化.和初始化(注入值的话)在Spring配置文件中的多个java类.等待用户的调用,用服务器端的缓存消耗换取客户端的快速响应. Ioc:反转控制.当实例化一个bean类时,传统的操作方式是由调用者进行实例化.在spring中,不再由调用者进行实

curator 锁之 Shared Reentrant Lock

1.描述 共享锁:全局同步分布式锁,同一时间两台机器只能有一台获得锁 2.参与类 InterProcessMutex 3.用法 3.1 创建 InterProcessMutex 实例 public InterProcessMutex(CuratorFramework client, String path) Parameters: client - client path - the path to lock 3.2 一般用法 用其中一个方法,获取锁 public void acquire()

第八章——对象

因为JavaScript是一种基于原型的语言,所有JavaScript中对象的工作方式,与其他基于类的语言中的对象不同.JavaScript对象基本上是属性和值的集合,这在编程中称为哈希表(hash table).其中的值可以是任意类型的数据,包括函数.数组和其他对象.可以使用对象从一处向另一处传递多个值(当使用JSON在JavaScript和另一门语言之间传递数据时,这是非常容易的,后面章节将对此进行讨论) 一.创建单一对象(单一对象用于特定目的,例如创建名值对,或创建不与其他对象共享代码的唯

JSP自定义标签开发

一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; 首先我们需要大致了解开发自定义标签所涉及到的接口与类的层次结构(其中SimpleTag接口与SimpleTagSupport类是JSP2.0中新引入的). 一, 自定义标签  :实现了特定接口的java类,封装了java代码编写的预定义行为.  * 在运行时,标签被替换成相应的预定义java代码. * JSP 自定义标记提

解密Java内存溢出之持久代

垃圾回收是Java程序员了解最少的一部分.他们认为Java虚拟机接管了垃圾回收,因此没必要去担心内存的申请,分配等问题.但是随着应用越来越复杂,垃圾回收也越来越复杂,一旦垃圾回收变的复杂,应用的性能将会大打折扣.所以,Java程序员了解垃圾回收的机制并且知道怎样解决“内存溢出”问题会有很大的益处.在Java中,有两个非常普遍的内存溢出问题.一个是堆内存溢出,另一个是持久代内存溢出. 持久代和类加载器 Java对象是java 类的实例.每当创建一个Java对象时,Java虚拟机都会创建该对象的内部

EF Entity Framework Core DBContext中文文档

Add(Object) 以添加状态开始跟踪给定的实体和任何其他尚未被跟踪的可访问实体,以便在调用SaveChanges()时将它们插入数据库.使用State设置单个实体的状态. Add<TEntity>(TEntity) 以添加状态开始跟踪给定的实体和任何其他尚未被跟踪的可访问实体,以便在调用SaveChanges()时将它们插入数据库.使用State设置单个实体的状态. AddAsync(Object, CancellationToken) 以添加状态开始跟踪给定的实体和任何其他尚未被跟踪的

功能强大的图片截取修剪神器:Android SimpleCropView及其实例代码重用简析(转)

功能强大的图片截取修剪神器:Android SimpleCropView及其实例代码重用简析 SimpleCropView是github上第一个第三方开源的图片修剪截取利器,功能强大,设计良好.我个人认为SimpleCropView比附录文章1介绍的cropper更为强大和完备,但也更为复杂,如果是简单的应用场景,那么cropper也是一个不错的选择,SimpleCropView则适应图片裁剪截取复杂的需求任务.SimpleCropView在github上的项目主页是:https://githu

vmware重装系统后虚拟机实例文件*.vmdk重用

如题:vmware重装系统后自定义的:虚拟机名称*.vmdk文件重用. 一.问题描述 系统磁盘坏道,装不上系统直接换了硬盘,但是新装的Vmware不能够通过open方式打开“自定义*.vmdk”(这个是新建虚拟机的实例). 二.解决方案 解决方法步骤: 1.打开虚拟机,新建一个同“自定义*.vmdk”同一平台的新的实例如:AwmXP. 2.找到虚拟机所在的磁盘路径,将原来的“自定义*.vmdk”的名字改为AwmXP.vmdk. 三.成果展示 vmware重装系统后虚拟机实例文件*.vmdk重用

httpModules与httpHandlers

ASP.NET对请求处理的过程: 当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给ASPNET_ISAPI.dll,ASPNET_ISAPI.dll会通过http管道(Http PipeLine)将请求发送给ASPNET_WP.exe进程,在ASPNET_WP.exe进程中通过HttpRuntime来处理这个请求,处理完毕将结果返回客户端. inetinfo.exe进程:是www服务的进程,IIS服务和ASPNET