ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Community Server之HttpHandler

Community Server之HttpHandler

原创 Linux操作系统 作者:iDotNetSpace 时间:2008-01-22 18:41:26 0 删除 编辑

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

看图先:

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

具体的类是这样定义的: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 (c) Telligent Systems Corporation.  All rights reserved.
//  
//------------------------------------------------------------------------------

using System;
using System.Web;

namespace CommunityServer.Components
{
    
/// 
    
/// Summary description for Redirect.
    
/// 

    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节点下可以看到

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


对该类的配置

· verb可以是"GET""POST",表示对GETPOST的请求进行处理。"*"表示对所有请求进行处理,这里是对GET请求进行处理。

· path指明对相应的文件进行处理,"*.aspx"表示对发给所有ASPX页面的请求进行处理,这里单独对redirect.aspx页面进行处理。可以指明路径,如"blogs"。表明只对blogs目录下的redirect.aspx文件请求进行处理。

· type属性中,逗号前的字符串指明HttpHandler的实现类的类名,后面的字符串指明Dll文件的名称。

实际处理是怎么样的呢?其实redirect.aspx页面在CS项目中并不存在,CS把对redirect.aspx的请求处理交给了CommunityServer.Components.dll程序集中Redirect类进行处理。处理的过程是执行

public void ProcessRequest(HttpContext context)

方法(Redirect类下的ProcessRequest方法是对当前请求的上下文ContextUrl是否包含“u”参数,如果有并且参数值不为null就调用Response.Redirect方法跳转到“u”参数值所执行的页面,如果没有参数或者参数值为空就跳转到CS的首页)

另外在CS中对RSSTrackback的处理都使用了httpHandler的处理方式。

前面提到,所有页面的基类Page都实现了HttpHandler接口,因此每个asp.net的页面都可以看成是一个HttpHandler处理类,只是配置部分在machine.config

 

<httpHandlers>
            
<add verb="*" path="*.vjsproj" type="System.Web.HttpForbiddenHandler"/><add verb="*" path="*.java" type="System.Web.HttpForbiddenHandler"/><add verb="*" path="*.jsl" type="System.Web.HttpForbiddenHandler"/><add verb="*" path="trace.axd" type="System.Web.Handlers.TraceHandler"/>
            
<add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
            
<add verb="*" path="*.ashx" type="System.Web.UI.SimpleHandlerFactory"/>
            
<add verb="*" path="*.asmx" type="System.Web.Services.Protocols.WebServiceHandlerFactory, System.Web.Services, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false"/>
            
<add verb="*" path="*.rem" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" validate="false"/>
            
<add verb="*" path="*.soap" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" validate="false"/>
            
<add verb="*" path="*.asax" type="System.Web.HttpForbiddenHandler"/>
            
<add verb="*" path="*.ascx" type="System.Web.HttpForbiddenHandler"/>
            
<add verb="GET,HEAD" path="*.dll.config" type="System.Web.StaticFileHandler"/>
            
<add verb="GET,HEAD" path="*.exe.config" type="System.Web.StaticFileHandler"/>
            
<add verb="*" path="*.config" type="System.Web.HttpForbiddenHandler"/>
            
<add verb="*" path="*.cs" type="System.Web.HttpForbiddenHandler"/>
            
<add verb="*" path="*.csproj" type="System.Web.HttpForbiddenHandler"/>
            
<add verb="*" path="*.vb" type="System.Web.HttpForbiddenHandler"/>
            
<add verb="*" path="*.vbproj" type="System.Web.HttpForbiddenHandler"/>
            
<add verb="*" path="*.webinfo" type="System.Web.HttpForbiddenHandler"/>
            
<add verb="*" path="*.asp" type="System.Web.HttpForbiddenHandler"/>
            
<add verb="*" path="*.licx" type="System.Web.HttpForbiddenHandler"/>
            
<add verb="*" path="*.resx" type="System.Web.HttpForbiddenHandler"/>
            
<add verb="*" path="*.resources" type="System.Web.HttpForbiddenHandler"/>
            
<add verb="GET,HEAD" path="*" type="System.Web.StaticFileHandler"/>
            
<add verb="*" path="*" type="System.Web.HttpMethodNotAllowedHandler"/>
        
httpHandlers>
 

借助一个工具:Reflector,看看Page类下的HttpHandler处理方法ProcessRequest都做了什么

[EditorBrowsable(EditorBrowsableState.Never)]
public void ProcessRequest(HttpContext context)
{
      
this.SetIntrinsics(context);
      
this.ProcessRequest();
}

private void SetIntrinsics(HttpContext context)
{
      
this._context = context;
      
this._request = context.Request;
      
this._response = context.Response;
      
this._application = context.Application;
      
this._cache = context.Cache;
      
if ((this._clientTarget != null&& (this._clientTarget.Length > 0))
      
{
            
this._request.ClientTarget = this._clientTarget;
      }

      
base.HookUpAutomaticHandlers();
}

private void ProcessRequest()
{
      Thread thread1 
= Thread.CurrentThread;
      CultureInfo info1 
= thread1.CurrentCulture;
      CultureInfo info2 
= thread1.CurrentUICulture;
      
this.FrameworkInitialize();
      
try
      
{
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639172/viewspace-157087/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-04

  • 博文量
    2376
  • 访问量
    5282498