`
piperzero
  • 浏览: 3549732 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

HttpHandler

阅读更多
转自http://ugoer.cnblogs.com/archive/2005/09/07/231676.html

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

看图先:

<shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600" id="_x0000_t75"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype>

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

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

接口IHttpHandler的定义如下:

interfaceIHttpHandler

{

voidProcessRequest(HttpContextctx);

boolIsReuseable{get;}

}

接口中

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

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

//------------------------------------------------------------------------------
//<copyrightcompany="TelligentSystems">
//Copyright(c)TelligentSystemsCorporation.Allrightsreserved.
//</copyright>
//------------------------------------------------------------------------------

usingSystem;
usingSystem.Web;

namespaceCommunityServer.Components
{
/**////<summary>
///SummarydescriptionforRedirect.
///</summary>

publicclassRedirect:IHttpHandler
{
publicRedirect()
{
//
//TODO:Addconstructorlogichere
//
}


publicvoidProcessRequest(HttpContextcontext)
{
stringurl=context.Request.QueryString["u"];
if(!Globals.IsNullorEmpty(url))
{
context.Response.Redirect(url);

}

else
{
context.Response.Redirect(Globals.GetSiteUrls().Home);
}


context.Response.End();
}


publicboolIsReusable
{
get{returnfalse;}
}

}

}

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

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

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

[EditorBrowsable(EditorBrowsableState.Never)]
publicvoidProcessRequest(HttpContextcontext)
{
this.SetIntrinsics(context);
this.ProcessRequest();
}

privatevoidSetIntrinsics(HttpContextcontext)
{
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();
}

privatevoidProcessRequest()
{
Threadthread1
=Thread.CurrentThread;
CultureInfoinfo1
=thread1.CurrentCulture;
CultureInfoinfo2
=thread1.CurrentUICulture;
this.FrameworkInitialize();
try
{
try
{
if(this.IsTransacted)
{
this.ProcessRequestTransacted();
}

else
{
this.ProcessRequestMain();
}

this.ProcessRequestEndTrace();
}

finally
{
this.ProcessRequestCleanup();
InternalSecurityPermissions.ControlThread.Assert();
thread1.CurrentCulture
=info1;
thread1.CurrentUICulture
=info2;
}

}

catch
{
throw;
}

}


Page类的ProcessRequest方法先是把上下文Context内容赋值到当前Page中的一些属性里,然后调用System.Web.UI.TemplateControl中的HookUpAutomaticHandlers()

internalvoidHookUpAutomaticHandlers()
{
if(this.SupportAutoEvents)
{
SimpleBitVector32vector1
=newSimpleBitVector32(this.AutoHandlers);
InternalSecurityPermissions.Reflection.Assert();
if(!vector1[1])
{
vector1[
1]=true;
this.GetDelegateInformation("Page_Init",refvector1,2,4);
this.GetDelegateInformation("Page_Load",refvector1,8,0x10);
this.GetDelegateInformation("Page_DataBind",refvector1,0x20,0x40);
this.GetDelegateInformation("Page_PreRender",refvector1,0x80,0x100);
this.GetDelegateInformation("Page_Unload",refvector1,0x200,0x400);
this.GetDelegateInformation("Page_Error",refvector1,0x800,0x1000);
http://ugoer.cnblogs.c
分享到:
评论

相关推荐

    通用 万能 HttpHandler webRequest 文件上传

    这个"通用 万能 HttpHandler"的概念是指一个设计得非常灵活和可复用的HttpHandler实现,能够处理多种不同的请求场景。在这个特定的情况下,我们关注的是文件上传功能,特别是通过HttpWebRequest来实现。 文件上传是...

    自定义Http处理及应用之HttpHandler篇

    HttpHandler 实现了类似于 ISAPI Server Extension 的功能,而 HttpModule 实现了类似于 ISAPI Filter 的功能。 HttpHandler 的概念和基本使用方法: HttpHandler 是一个接口,用于处理 Http 请求和响应。它提供了...

    HttpModule和httpHandler学习例子

    HttpHandler可以根据不同的文件类型或请求路径进行配置,例如,`.aspx`页面由`PageHandlerFactory`处理,静态文件(如图片、CSS)由`StaticFileHandler`处理。 关于HttpHandler,以下几点值得关注: 1. **注册...

    HttpHandler防图片盗链

    在ASP.NET开发中,"HttpHandler防图片盗链"是一个重要的技术实践,它涉及到网站资源保护、服务器性能优化以及网络安全等多个方面。通过Web.config配置,我们可以实现一个简单但有效的图片防盗链策略,防止他人未经...

    测试代码:Asp.Net底层解析(五)——HttpHandler详解

    在本篇中,我们将深入探讨HttpHandler的概念、工作原理以及如何编写自定义HttpHandler。 HttpHandler是ASP.NET应用程序中处理特定类型HTTP请求的类。每当一个用户向服务器发送请求时,IIS(Internet Information ...

    HttpHandler做图片水印

    这个标题“HttpHandler做图片水印”表明我们将探讨如何利用HttpHandler来实现图片的水印功能。图片水印通常用于在图像上添加标识或版权信息,以防止未经授权的使用或保护图像的原创性。 首先,我们需要理解...

    使用HttpHandler实现文件下载页面

    示例: Hello,HttpHandler(最简单的HttpHandler) -------------------------------------------------------------------------------- 示例: 使用HttpHandler实现文件下载页面 ---------------------------------...

    利用httphandler实现网站伪静态

    在ASP.NET中,我们可以使用HttpHandler来实现这一功能。 **HttpHandler** 是ASP.NET中的一个核心组件,它处理HTTP请求并返回响应。通过自定义HttpHandler,我们可以拦截特定类型的请求,并对其进行定制处理。在实现...

    图片在线裁剪(jQuery + HttpHandler)C#源码

    本项目提供了基于jQuery和HttpHandler的C#源码实现,使得开发者能够轻松集成到自己的Web应用程序中,为用户提供方便的图片裁剪功能。下面我们将详细探讨这个技术实现的关键知识点。 1. **jQuery**: jQuery是一个...

    ASP.NET架构详解HttpHandler和HttpModule高清PDF文字版

    在这个主题中,我们将深入探讨ASP.NET架构中的两个关键组件:HttpHandler和HttpModule。 **HttpHandler**是ASP.NET处理HTTP请求的核心组件。每个HTTP请求都会被路由到一个特定的HttpHandler,它负责处理特定类型的...

    3种开发模式(XMLHTTP+Web Form、XMLHTTP+HttpHandler和Call Back)开发Hello Word程序

    本篇文章将深入探讨三种常见的开发模式:XMLHTTP+Web Form、XMLHTTP+HttpHandler以及Callback,并以"Hello World"程序为例,来阐述每种模式的工作原理和实现方式。 1. **XMLHTTP+Web Form** Web Form是ASP.NET框架...

    asp.net 构架之httphandler

    利用HttpHandler创建自定义后缀Rss源 通过IhttpHandler实现图片验证码 使用HttpHandler实现图片防盗链

    asp.net 防注入的 HttpHandler

    asp.net 防注入的 HttpHandler asp.net 防注入的 HttpHandler

    异步Httphandler

    在.NET框架中,HTTP...总之,异步HttpHandler是.NET ASP.NET开发中的一个强大工具,它利用异步编程模型来优化性能,特别是在处理I/O密集型任务时。通过正确实现和配置,你可以显著提高Web应用程序的效率和用户体验。

    水印图片 HttpHandler

    在本主题中,我们将深入探讨如何使用HttpHandler来为系统图片添加水印,这是一个常见的图像处理任务,通常用于版权保护或者增加视觉效果。水印图片HttpHandler的实现涉及图像处理、HTTP请求生命周期以及自定义处理器...

    httpmodule和httphandler

    ### httpmodule和httphandler详解 #### 一、概述 在ASP.NET开发中,`HttpModule`和`HttpHandler`是两个重要的概念,它们都属于HTTP运行时的一部分,用于处理HTTP请求的不同方面。掌握这两者之间的区别以及如何使用...

    Community Server专题四:HttpHandler

    在本文中,我们将深入探讨HttpHandler的概念、工作原理以及如何在Community Server中应用HttpHandler。 HttpHandler是ASP.NET管道模型的一部分,这个模型包括一系列的事件和阶段,从请求到达服务器到响应返回客户端...

    关于HttpHandler与HttpModule的理解和应用方法

    在深入理解HttpHandler和HttpModule之前,我们需要明确两者在***应用程序中所扮演的角色以及它们是如何运作的。***是构建动态网页和网络应用程序的一个框架,其中处理请求的方式是通过一个称为请求管线的机制。 1. ...

    session在httphandler失效

    然而,在某些情况下,如标题所示,“session在httphandler失效”,这可能会导致应用程序出现问题。下面将详细解释这个问题,以及可能的原因和解决方案。 首先,让我们理解Session的工作原理。ASP.NET的Session是...

Global site tag (gtag.js) - Google Analytics