日期:2010-07-11  浏览次数:20463 次

HttpHandler实现了ISAPI Extention的功能,他处理请求(Request)的信息和发送响应(Response)。HttpHandler功能的实现通过实现IHttpHandler接口来达到。

看图先:

Community Server专题四:HttpHandler

在ASP.NET 管道处理的末端是HTTP Hander,其实每个Asp.net的Page都实现了IHttpHander,在VS.net中的对象察看器中你可以证实这一点

Community Server专题四:HttpHandler

具体的类是这样定义的:public class Page : TemplateControl, IhttpHandler。

接口IHttpHandler的定义如下:

interface IHttpHandler

{

void ProcessRequest(HttpContext ctx);

bool IsReuseable { get; }

}

接口中ProcessRequest是添加自己的代码进行相应处理的地方。IsReuseable属性指明该HttpHandler的实现类是否需要缓存。

在CS中有很多继承IHttpHandler接口的类,我取出有代表性而又容易理解的一个做分析:找到CommunityServerComponents项目Components目录下的Redirect.cs文件,内容如下:

//------------------------------------------------------------------------------
// <copyright company="Telligent Systems">
//     Copyright (c) Telligent Systems Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------

using System;
using System.Web;

namespace CommunityServer.Components
{
    /**//// <summary>
    /// Summary description for Redirect.
    /// </summary>
    public class Redirect : IHttpHandler
    {
        public Redirect()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        public void ProcessRequest(HttpContext context)
        {
            string url = context.Request.QueryString["u"];
            if(!Globals.IsNullorEmpty(url))
            {
                context.Response.Redirect(url);
               
            }
            else
            {
                context.Response.Redirect(Globals.GetSiteUrls().Home);
            }

            context.Response.End();
        }

        public bool IsReusable
        {
            get { return false; }
        }
    }
}

这里的Redirect功能是在web请求满足HttpHandler配置文件中预设条件下自动拦截执行的,在web.config中<httpHandlers>节点下可以看到

<add verb="GET" path="Utility/redirect.aspx" type="CommunityServer.Components.Redirect, CommunityServer.Components" />

对该类的配置

· verb可以是"GET"或"POST",表示对