【IHttpHandler】了解 IHttpHandler

1 、概述

说明:HttpHandler是一个HTTP请求的真正处理中心。在HttpHandler容器中,ASP.NET Framework才调用HttpHandler的ProcessRequest成员方法来对这个HTTP请求进行真正的处理,真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。

2、举例

以一个aspx页面为例,正是在HttpHandler这里,一个aspx页面才被系统处理解析,并将处理完成的结果继续经由HttpModule传递下去,直至到达客户端。当然,对于aspx页面,ASP.NET Framework在默认情况下是交给System.Web.UI.PageHandlerFactory这个HttpHandlerFactory来处理的。当一个HTTP请求到达这个HttpHandlerFactory时,HttpHandlerFactory会提供出一个HttpHandler容器,交由这个HttpHandler容器来处理这个HTTP请求。 一个HTTP请求都是最终交给一个HttpHandler容器中的ProcessRequest方法来处理的。

3、HttpHandler

(1)实现HttpHandler,必须继承自IHttpHandler接口。下面是这个接口的定义:

using System;

namespace System.Web
{
    public interface IHttpHandler
    {
        //  其他Request是否可以使用IHttpHandler
        bool IsReusable { get; }

        //  处理HttpRequest
        void ProcessRequest(HttpContext context);
    }
}

(2)自定义HttpHandler

新建一个网站,default.aspx页面:default.aspx.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write("<br/>来自Default.aspx页面<br/>");
        }
    }
}

新添一个类库MyHandler,添加一个类如下:

using System;
using System.Web;
using System.Web.SessionState;

namespace WebApplication1
{
    public class MyTestHandler : IHttpHandler, IRequiresSessionState
    {
        public bool IsReusable { get { return true; } }
        public void ProcessRequest(HttpContext context)
        {
            context.Response.Write("<h3><b>This is a HttpHandler Test</b></h3>");
            context.Session["Test"] = "<h3><span style=\"color:blue;\">在HttpHandler容器中调用Session</span></h3>";
            context.Response.Write(context.Session["Test"]);
        }
    }
}

(3)配置文件
      在web.config文件的system.web节点下,添加:

      <add verb="*" path="*.aspx" type="WebApplication1.MyTestHandler, WebApplication1" />

(4)注意

<1>、.NET为asp.net提供了很多系统默认HttpHandler类,用来适应不同类型的HttpRequest。比如aspx,在machine.config中是这样定义的:   
        <add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
这就说明遇到aspx的Request请求,asp.net会将其交给System.Web.UI.PageHandlerFactory的HttpHandler类来处理。
<2>、如果自己定义了新的HttpHandler,而且在web.config中指定,则系统只会使用这个新的HttpHandler,而不再使用原先默认的或者指定的.

4、HttpHandlerFactory

ASP.NET Framework实际不直接将相关的页面资源HTTP请求定位到一个其内部默认的IHttpHandler容器之上,而定位到了其内部默认的IHttpHandler工厂上。IHttpHandler工厂的作用是对IHttpHandler容器进行调度和管理,这样做的优点是大大增强了系统的负荷性,提升了效率。

(1)IHttpHandlerFactory接口
IHttpHandlerFactory接口包含两个方法:GetHandler方法返回实现IHttpHandler接口的类的实例,ReleaseHandler方法使工厂可以重用现有的处理程序实例。

using System;
using System.Web;

namespace System.Web.UI
{
    public class PageHandlerFactory : System.Web.IHttpHandlerFactory2, IHttpHandlerFactory
    {
        protected internal PageHandlerFactory();
        public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string virtualPath, string path);
        public virtual void ReleaseHandler(IHttpHandler handler);
    }
}

(2) 实现一个简单的HttpHandler工厂
类库新添一个文件MyHandlerFactor.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WebApplication1
{
    public class MyHandlerFactory : IHttpHandlerFactory
    {

        public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
        {
            string fileName = url.Substring(url.LastIndexOf("/") + 1);
            string objName = fileName.Substring(0, fileName.IndexOf("."));
            string className = "WebApplication1." + objName;

            object objHandler = null;

            try
            {
                // 采用动态反射机制创建相应的IHttpHandler实现类。
                objHandler = Activator.CreateInstance(Type.GetType(className));
                context.Response.Write(className);
            }
            catch (Exception e)
            {
                throw new HttpException("工厂不能为类型" + objName + "创建实例。", e);
            }
            return (IHttpHandler)objHandler;
        }

        public void ReleaseHandler(IHttpHandler handler)
        {
        }

    }

    public class Handler1 : IHttpHandler
    {
        public bool IsReusable { get { return true; } }

        public void ProcessRequest(HttpContext context)
        {
            context.Response.Write("<br/>这是来自于MyHandlerFactory里的处理.<br/>");
            context.Response.Write("<h3>来自Handler1的信息.</h3>");
        }
    }

    public class Handler2 : IHttpHandler
    {
        public bool IsReusable { get { return true; } }

        public void ProcessRequest(HttpContext context)
        {
            context.Response.Write("<br/>这是来自于MyHandlerFactory里的处理.<br/>");
            context.Response.Write("<h3>来自Handler2的信息.</h3>");
        }
    }
}

   <add verb="*" path="Handler1.aspx" type="WebApplication1.MyHandlerFactory,WebApplication1"/>
   <add verb="*" path="Handler2.aspx" type="WebApplication1.MyHandlerFactory,WebApplication1"/>

到这里,针对Handler1.aspx和Handler2.aspx两个页面的http请求我们就通过HttpHandler工厂处理好了。

5、HttpHandler和HttpModule的区别

主要有两点:
(1)先后次序.先IHttpModule,后IHttpHandler,IHttpHandler处理结束后再交给IHttpModule;
(2)对请求的处理上:
        IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,html,rar的请求;
        IHttpHandler则属于挑食类型,只有asp.net注册过的文件类型(例如aspx,ascx,asmx等等)才会轮到调用它。

时间: 2024-11-13 19:06:17

【IHttpHandler】了解 IHttpHandler的相关文章

重写IHttpHandler,实现前后端分离

再说重写IHttpHandler,实现前后端分离 aspx页面第一次加载时,HttpHandler 里面是如何编译指定页面的呢?Framework提供了编译页面的API如下: BuildManager.CreateInstanceFromVirtualPath(url, typeof(System.Web.UI.Page));根据虚拟路径生成实例. 但是url页面此时必需继承System.Web.UI.Page,就是我们常见的ASPX页面.但是这样编译时会调用aspx视图引擎来解析aspx和对应

IHttpModule与IHttpHandler的区别整理

IHttpModule与IHttpHandler的区别整理1.先后次序.先IHttpModule,后IHttpHandler. 注:Module要看你响应了哪个事件,一些事件是在Handler之前运行的,一些是在Handler之后运行的2.对请求的处理上:IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.3

在IHttpHandler中获取session

因为业务要异步通过IHttpHandler获得数据,但还要根据当前登录人员的session过滤,因此要在在IHttpHandler中获取session 方法是HttpHandler容器中如果需要访问Session,必须实现IRequiresSessionState接口,这只是一个标记接口,没有任何方法. 声明时加上 public class MyHandler : IHttpHandler,IRequiresSessionState 具体httphandler介绍可见 一点一点学ASP.NET之

【IHttpHandler】HttpModule,HttpHandler,HttpHandlerFactory简单使用

这三个对象我们在开发Asp.net程序时经常会用到,似乎很熟悉,但有时候又不太确定.本文通过一个简单的例子来直观的比较一下这三个对象的使用. HttpModule:Http模块,可以在页面处理前后.应用程序初始化.出错等时候加入自己的事件处理程序 HttpHandler:Http处理程序,处理页面请求 HttpHandlerFactory:用来创建Http处理程序,创建的同时可以附加自己的事件处理程序 例子很简单,就是在每个页面的头部加入一个版权声明. 一.HttpModule 这个对象我们经常

【IHttpHandler】使用IHttpHandler防盗链

防盗链的原理,从图片请求的URL地址上判断是否是我们自己网站上的域名,如果不是,恭喜,你的图片已经被盗链了! 那么我来介绍下图片放盗链的一个方法 首先,添加个httpHandlers请求,webconfig部分配置节如下: <httpHandlers>          <add verb="*" path="*.jpg" type="myhandler,App_Code"/>    </httpHandlers&g

【IHttpHandler】ASP.NET 生命周期

对由 Microsoft? Internet 信息服务 (IIS) 处理的 Microsoft? ASP.NET 页面的每个请求都会被移交到 ASP.NET HTTP 管道.HTTP 管道由一系列托管对象组成,这些托管对象按顺序处理请求,并将 URL 转换为纯 HTML 文本.HTTP 管道的入口是 HttpRuntime 类.ASP.NET 结构为辅助进程中的每个 AppDomain 创建一个此类的实例.(请注意,辅助进程为每个当前正在运行的 ASP.NET 应用程序维护一个特定的 AppDo

ASP.NET MVC 利用IRouteHandler, IHttpHandler实现图片防盗链

你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽.下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义RouteHandler来防止其他人盗链你的图片. 在ASP.Net MVC程序中首先涉及的部件是UrlRoutingModule,它是System.Web.Routing的一部分.UrlRoutingModule用于第一次检查请求的url和本地磁盘中的文件是否相匹配.如果匹配,UrlRoutingMo

IHttpHandler的那些事

写在前面 从上家公司离职,在家休息,闲着无聊,觉得还是有必要将IHttpHanlder的内容,做一个总结.发现在写demo的过程中,总觉得有点生疏了,项目中很少使用自定义的类来实现该接口.当然,一般处理程序除外. IHttpModule的那些事 IHttpHandler 在IHttpModule这篇文章中,有一个asp.net生命周期的简图.忘记的可以,翻到那篇文章,再熟悉一下. 当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做

Asp.Net IHttpHandler介绍

Asp.Net IHttpHandler介绍 ASP.NET响应Http请求时常用的两个处理接口是IHttpHandler和IHttpModule. 一般的,IHttpHandler用来处理一类特定的请求,比如对每个*.asp, *.aspx文件的分别处理.而IHttpModule通常用来处理所以请求共同需要的操作,比如对所以请求页面进行某些相同的检查功能. 我们先来看一下IIS服务器在相应Http请求时的处理步骤. ASP.NET中有管线(Pipeline)这个概念,意指每个ASP.NET请求