理解并自定义HttpHandler

前言                                   

  之前从网上找了几篇讲解如何自定义HttpHandler的文章,依葫芦画瓢却一直没成功过。经过上一篇《asp.net管道模型(管线模型)之一发不可收拾》的总结,对管道模型和请求/响应过程有进一步的了解后,再结合Asp.Net 构架(Http Handler 介绍) - Part.2后终于成功定义自己的HttpHandler和HttpHandlerFactory了^_^、

  本文有些地方会跟《asp.net管道模型(管线模型)之一发不可收拾》有些重叠,但角度会有所不同,两篇文章相互补充,希望能完整地呈现管道模型的全貌。

目录                                   

1.发送Default.aspx时默认得到相应HttpHandler的过程

2.如何配置

3.自定义HttpHandler

4.自定义HttpHandlerFactory

5.应用实例

发送Default.aspx时默认得到相应HttpHandler的过程           

  IIS下有一个metabase文件,可通过网站—》属性—》主目录—》配置—》映射中添加、修改、删除。

            图1

IIS会检查请求文件是否在metabase文件中有对应的处理应用程序。default.aspx对应的是Aspnet_ISAPI.exe来处
理(所以执行文件路径为Aspnet_ISAPI.exe的文件均由它处理),然后Aspnet_ISAPI.exe就把请求转发到Asp.net工作进
程。跳到管道模型的HttpApplication中(之前还有很多步骤,这里着重讲解HttpApplication后面的步
骤),HttpApplication根据Url的后缀名调用相应的HttpHandlerFactory(默认情况下.aspx调用
System.Web.UI.PageHandlerFactory,.ashx调用
System.Web.UI.SimpleHandlerFactory),然后HttpHandlerFactory在生成default.aspx具
体的HttpHandler实例。

如何配置                                 

之前一直迷失在如何配置的问题上,这里先说明白吧!

下面是自定义HttpHandler时配置的根据:

IIS进行第一次筛选,HttpApplication进行第二次筛选。所以

1.自定义时要配置IIS让它把对应的文件后缀映射到Asp_ISAPI.exe来处理;

2.在应用程序级web.config中配置<HttpHandlers>节点使HttpApplication能根据配置把请求交由相应的HttpHandlerFactory或HttpHandler处理。

具体web.config配置:



1 <handlers>
2   <add verb="*" path="*.myhandler" type="My.MyHandler,MyAssembly"/>
3 </handler>

verb:请求动作(get,post,*);

path:文件路径(*通配符);

type:,前的参数为自定义HttpHandler或HttpHandlerFactory的完整类名(含命名空间),,后的参数为自定义HttpHandler或HttpHandlerFactory所在的程序集名(不含dll后缀)。

 

自定义HttpHandler                           

  定义一个继承IHttpHandler接口的类并实现接口的方法:

public class MyHandler:IHttpHandler
{
    public MyHandler()
    {
    }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/html";
        context.Response.Write("MyHandler");
    }

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

1.ProcessRequest方法就是具体处理请求的地方;

2.IsReusable标识该HttpHandler类的实例对象是否可重用。就是当第一个请求发送过来时,实例化一个HttpHandler实
例对象,如果IsReusable为true,那么第二个请求发送过来时就可以用回该实例对象而不用重新构造一个,如果为false就要重新构造一个实
例。(有点啰嗦了(*^__^*) 嘻嘻……)一般返回true,提高效率嘛!!

web.config中配置



1 <Handlers>
2   <add verb="*" path="*.gif" type="MyHandler,MyHandler"/>
3 </Handlers>

IIS中配置,在图1中添加一项映射项,扩展名为.gif,可执行文件路径为C:\WINDOWS\Microsoft.NET
\Framework\v2.0.50727\aspnet_isapi.dll,动作为全部动作,然后把“确定文件是否存在”的复选框取消选中(如果选
中了,就必须由对应的文件存在才能处理,如url为a.gif,就必须有a.gif文件真实存在,否则就返回404)。

 注意:自定义的HttpHandler必须放在其他项目工程中,然后引用到Web项目中,也就是说配置文件中的type的程序集名称必须写,否则无法执行。

自定义HttpHandlerFactory                       

定义一个继承IHttpHandlerFactory接口的类并实现接口的方法:

public class MyHandlerFactory:IHttpHandlerFactory
{
    public MyHandlerFactory()
    {
    }

    #region IHttpHandlerFactory 成员

    public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
    {
        return new MyHandler();
    }

    public void ReleaseHandler(IHttpHandler handler)
    {
        throw new NotImplementedException();
    }

    #endregion
}

1.GetHandler获取新的具体的HttpHandler实例;

2.ReleaseHandler使工厂可以重用现有的处理程序实例。

web.config中配置



1 <Handlers>
2   <add verb="*" path="*.gif" type="MyHandlerFactory,MyHandlerFactory"/>
3 </Handlers>

这里不用配置MyHandler。

IIS中配置,在图1中添加一项映射项,扩展名为.gif,可执行文件路径为C:\WINDOWS\Microsoft.NET
\Framework\v2.0.50727\aspnet_isapi.dll,动作为全部动作,然后把“确定文件是否存在”的复选框取消选中(如果选
中了,就必须由对应的文件存在才能处理,如url为a.gif,就必须有a.gif文件真实存在,否则就返回404)。

 

应用实例                                 

     Asp.Net 构架(Http Handler 介绍) - Part.2中有一个使用HttpHandler防止图片盗链的实例,很实用哦!

时间: 2024-08-18 09:07:11

理解并自定义HttpHandler的相关文章

理解并自定义HttpModule

前言   继上一篇理解并自定义HttpHandler后,有进行了HttpModule的进一步学习,本篇作为一个小结.   主要参考:Asp.Net 构架(HttpModule 介绍) - Part.3 目录 1.到底什么是HttpModule? 2.系统内部的HttpModule. 3.配置HttpModule. 4.自定义HttpModule. 5.Global.asax文件与HttpModule.   到底什么是HttpModule Asp.net的事件分为三级:应用程序级.页面级和控件级.

在自定义HttpHandler中使用Session

session 最近需要做一个对特定请求进行响应的接口,只是在内部处理,不存在UI,机于这种情况,当然是使用实现IHttpHandler来进行处理,可以减掉加载HTML 控件的时间.本来都是这样想的,对于IHttpHandler 中定义了两个方法,ProcessRequest(HttpContext ctx) 和 IsRunable() 这两个,看到在ProcessRequest(HttpContext ctx) 中有个HttpContext的输入参数,本来以为通过这个就可以对所有的服务器对象进

深入理解jquery自定义动画animate()_jquery

在以前很长一段时间里,网页上的各种特效还需要采用flash 在进行.但最近几年里,我们已经很少看到这种情况了,绝大部分已经使用JavaScript 动画效果来取代flash.这里 说的取代是网页特效部分,而不是动画.网页特效比如:渐变菜单.渐进显示.图片轮播等:而动画比如:故事情节广告.MV 等等.  如果复制当前代码进行在本地测试的时候,请注意把不需要(其他功能展示)的代码注释掉. <!DOCTYPE html> <html xmlns="http://www.w3.org/

深入理解Android 自定义attr Style styleable以及其应用

相信每一位从事Android开发的猿都遇到过需要自己去自定义View的需求,如果想通过xml指定一些我们自己需要的参数,就需要自己声明一个styleable,并在里面自己定义一些attr属性,这个过程相信大家都比较了解.当然,属性其实也不一定需要和View配合使用,比如我想通过一个Theme中的style对一个库进行一些简单参数的配置,这应该怎么做呢?我今天在封装一个库时在这个地方浪费了较多时间,最后没办法,到处搜搜资料,记录在这里吧,相信对大家都有帮助. attr和styleable的关系 首

自定义HttpHandler的问题

问题描述 但是访问页面并没有看到thisis***的消息发布到服务器上也是这个样子扩展名也用过自定义的.就是不执行这个Handler高手帮忙解决一下 解决方案 解决方案二:如果以配置的方式注册Handler,则需要将你的代码生成至所配置的独立dll中,也就是Handlers.dll并放到bin里另外要注意,<system.webServer>这个配置节是针对IIS7以上新增的对应IIS6中的<system.Server>节,所以最好这两个节中都配置一下解决方案三:引用1楼dongx

自定义HttpHandler问题...

问题描述 我自己定义了一个HttpHandler.usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Web;usingSystem.Web.SessionState;namespaceMyHandler{///<summary>///</summary>publicclassMyFirstHandler:IHttpHandler,IRequiresSessionState{#region

Asp.net管道模型(管线模型)之一发不可收拾

前言   为什么我会起这样的一个标题,其实我原本只想了解asp.net的管道模型而已,但在查看资料的时候遇到不明白的地方又横向地查阅了其他相关的资料,而收获比当初预想的大了很多.   有本篇作基础,下面两篇就更好理解了:   理解并自定义HttpHandler   理解并自定义HttpModule 目录   一般不写目录,感觉这次要写的东西有些多就写一个清晰一下吧.   1.Asp.net管道模型:   2.进程的子进程与进程的线程:   3.应用程序域(AppDomain):   4.IIS5

MVC系列(8) UrlRouting的理解

根据对Http Runtime和Http Pipeline的分析,我们知道一个ASP.NET应用程序可以有多个HttpModuel,但是只能有一个HttpHandler,并且通过这个 HttpHandler的BeginProcessRequest(或ProcessRequest)来处理并返回请求,前面的章节将到了再 MapHttpHandler这个周期将会根据请求的URL来查询对应的HttpHandler,那么它是如何查找的呢? 一起我们在做自定义HttpHandler的时候,需要执行URL以及

妙用Asp.Net中的HttpHandler

asp.net 很多时候,我们新建一个xxx.aspx页和xxx.aspx.cs文件,不过是为了实现一个很简单的功能,如:输出xmlDom,注销并跳转,并没有什么html的输出,很是麻烦,需要新建一个页,删除多余的html,并在page_load里面写处理代码.而使用HttpHandler就不需要这么麻烦了. 可以用任何符合公共语言规范 (CLS) 的语言编写自定义 HTTP 处理程序来处理特定的.预定义类型的 HTTP 请求.响应这些特定请求的是在 HttpHandler 类中定义的可执行代码