public bool IsReusable
{
get
{
return false;
}
}
属性,将该属性的值改为true,为什么不起作用?按照MSDN的解释,该属性的意思是:
“获取一个值,该值指示其他请求是否可以使用 IHttpHandler 实例,如果 IHttpHandler 实例可再次使用,则为 true;否则为
false。”
看到这个解释可能部分学生就会想把该属性的值设置为true,就可以重复利用 IHttpHandler 实例,达到提升性能的目的。
但是即使将该属性的值设置为true.也是没有什么作用。今天把这个属性说一下,
我们知道,*.ashx 是交给SimpleHandlerFactory处理的,在该类中,调用GetHandler()方法直接返回相应的实例,也就是在
SimpleHandlerFactory中没有用到IsReusable属性。
首先先从MapHandlerExecutionStep类中的 context.Handler = this._application.MapHttpHandler(context,
request.RequestType, request.FilePathObject, request.PhysicalPathInternal, false)开始看一下,MapHttpHandler方法,
的作用就是创建一个HttpHandler对象,展开该方法有如下代码需要注意, HttpHandlerAction mapping =
this.GetHandlerMapping(context, requestType, path, useAppConfig),该方法的作用就是从<httpHandlers>节中根据请求
的方式(requestType)和路径(path)获取相应的配置项,最后的返回类型是HttpHandlerAction
。如果展开GetHandlerMapping方法,那么大体上的工作是,先从缓存中去查找,如果找不到再去从配置文件中查找相应的映射。
在MapHttpHandler方法中还有一个地方就是 IHttpHandlerFactory factory = this.GetFactory(mapping);该接口创建的是
HttpHandler。
我们知道ashx能直接处理HTTP请求,它们都实现了IHttpHandler接口,因为已经完成了相应的配置,默认的配置信息如下:
<httpHandlers>
<add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="true"/>
</httpHandlers>
并且SimpleHandlerFactory也实现了IHttpHandlerFactory接口,所以可以根据请求的路径创建一个IHttpHandler实例。
HttpApplication在处理请求时,并不会直接创建一个IHttpHandler的实例,而是先获取一个IHttpHandlerFactory的对象,
再调用GetHandler()方法来获取一个IHttpHandler实例。