使用IHttpHandler接口实现【不同路径+任意URL后缀重写到指定页面且URL地址不变】(附源码)_AX...

【序】
VS2003版
弄了两天,终于搞定了!先谢谢俺同事韦先生!!谢谢梁经理告诉我有IHttpHandler和IHttpModule这两个东西,以前都没有接触过,其实有一般多功劳都是韦先生的,我只是负责写文档的打手....
【需求】
使用不同网址对应一个页面文件,如
源路径:http://www.IHttpHandler.com/target/target.aspx
使用下面地址也可到达该页面:
不同后缀:http://www.IHttpHandler.com/target/target.ax
不同路径:http://www.IHttpHandler.com/target.ax
                 http://www.IHttpHandler.com/sadfsadfsa/safdsaf/target.ax


这些网址都会指向网站的/target/target.aspx页面上.
【开工】
①VS2003新建一个ASP.NET解决方案,名称为:IhttpHandler
      在IhttpHandler项目下新建一个文件夹:target
      在target文件夹下建一个网页:target.aspx
②添加一个新【类库】项目:AXzhz
     删掉自动生成的类文件
     新建一个类文件:AX
    这个地方很有点小技巧
      ⅰ为了使URL在页面跳转时不变,我使用了Server.Transfer()方法,但使用这个方法又必须继承:System.Web.UI.Page类
       ⅱ而System.Web.UI.Page类也实现了ProcessRequest()方法 和IsReusable属性,需要对它们使用new关键字进行覆盖
     至于具体的页面转向,可以按照业务逻辑,也可以使用正则表达式等,我们完全可以按照自己的需要自由发挥!

 1 None.gif using  System;
 2 None.gif using  System.Collections;
 3 None.gif using  System.ComponentModel;
 4 None.gif using  System.Web;
 5 None.gif using  System.Web.SessionState;
 6 None.gif public   class  AX : System.Web .UI .Page ,IHttpHandler
 7 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 8InBlock.gif    //如果URL为*.ax,则执行下面的方法
 9InBlock.gif    public new void ProcessRequest(HttpContext context) 
10ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
11ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//*当前上下文的请求
12InBlock.gif        删除后,出现:
13ExpandedSubBlockEnd.gif        异常详细信息: System.Web.HttpException: 请求在此上下文中不可用*/

14InBlock.gif        HttpRequest Request = context.Request;
15InBlock.gif
16InBlock.gif        //获取域名后面的内容
17InBlock.gif        string strPathAndQuery=Request.Url .PathAndQuery ;
18InBlock.gif        //取出URL最后面的页面名
19InBlock.gif        string filename=strPathAndQuery.Substring (strPathAndQuery.LastIndexOf ("/"),strPathAndQuery.LastIndexOf (".")-strPathAndQuery.LastIndexOf ("/"));
20InBlock.gif        //设定要转向的网页
21InBlock.gif        Server.Transfer ("~/target"+filename+".aspx");
22ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//*下面这句话可以使任何以.ax后缀的URL转向到
23ExpandedSubBlockEnd.gif        一个固定的相对路径网页target.aspx上*/

24InBlock.gif        //Server .Transfer ("/target/target.aspx");
25InBlock.gif        
26ExpandedSubBlockEnd.gif    }

27InBlock.gif    //HttpHandler被设置为同步。同步处理程序在完成对为其调用该处理程序的 HTTP 请求的处理后才会返回。
28InBlock.gif    public new bool IsReusable 
29ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{        
30ExpandedSubBlockStart.gifContractedSubBlock.gif        get dot.gifreturn false; }  
31ExpandedSubBlockEnd.gif    }

32ExpandedBlockEnd.gif}

33 None.gif


③回到IhttpHandler项目中,修改Web.config文件,添加节点,如下,注意,是添加节点,下面非完整代码,只是示意在哪个节点下添加该节点.

配置节中的项具有三个属性,如下表中所示。

属性 说明
路径 路径属性可以包含单个 URL 路径或简单的通配符字符串(例如 *.aspx)。
类型 指定逗号分隔的类/程序集组合。ASP.NET 首先在应用程序的专用 \bin 目录中搜索程序集 DLL,然后在系统程序集缓存中搜索程序集 DLL。
谓词 谓词列表可以是逗号分隔的 HTTP 方法列表(例如“GET, PUT, POST”),也可以是开始脚本映射(例如通配符 * [星号])。


1 None.gif < configuration >     
2 None.gif   < system.web >
3 None.gif        < httpHandlers >
4 None.gif        < add verb = " * "  path = " *.ax "  type = " AX,AXzhz "   />
5 None.gif        httpHandlers >
6 None.gif   < system.web >
7 None.gif < configuration >   


④在IhttpHandler项目中添加对AXzhz的引用,如下图

使用IHttpHandler接口实现【不同路径+任意URL后缀重写到指定页面且URL地址不变】(附源码)_AX..._第1张图片


⑤最最重要的一步,在IIS上注册.ax后缀.就这个浪费了我n多大好的光阴!!!!
    在你的网站(配置网站我就不说了,不会的话,见:
      http://www.cnblogs.com/AXzhz/archive/2006/10/25/539371.html)
    上右键打开属性对话框→【主目录】标签→【配置】→【添加】
    可执行文件路径:C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll

    记得一定要把【确认文件是否存在】的对钩去掉!!!调试它费老劲了!!....   


使用IHttpHandler接口实现【不同路径+任意URL后缀重写到指定页面且URL地址不变】(附源码)_AX..._第2张图片

⑥OK,按F5吧,gogogogo...................


【资料】我不喜欢Copy/Paste.送大家个MSDN链接,把这个链接相关联的页面看了也就差不多了:
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconhttphandlerregistration.asp

【总结】
Ⅰ.MSDN还是比较不错的,但其描述的也不是很细的,
比如说步骤⑤
它一句话带过:
确保将 HttpHandler 文件扩展名注册到 Internet 信息服务 (IIS) 中。
Ⅱ.加深了对页面访问的流程理解:
用户输入URL按回车→IIS匹配其配置过的扩展名→如果有该扩展名,调用该扩展名的.dll文件→Web.config的节点→如果匹配上节点的规则→调用该节点标明的类(本例中的AX类)→执行类中的ProcessRequest()方法→把控制权再交给Application→正常的网页生成过程.参见(http://www.cnblogs.com/AXzhz/archive/2006/08/15/477668.html)其实也没必要记那么清楚,我自己写的自己都说不出来了,大体意思知道就行了.
Ⅲ.和同事合作,共同研究,集体的力量是强大的,三个诸葛亮,总比一个强.
比如这篇帖子,韦先生会IIS注册扩展名,我则知道Server.Tansfer()这个方法可以在不改变URL的情况下进行跳转(这个是我同事李哥告诉我的)
Ⅳ.还是仔细,被IIS的默认选项给害了.
【确认文件是否存在】默认是选中的.
Ⅴ怎么适应VS2005里潮流?
很想在VS2005上做,移植不过去:不能在ASP.NET项目中添加类库项目,可以用csc命令生成dll文件,引用一下,但我不知道参数是什么,我讨厌命令行,,还有VS2005  ASP.NET项目里没有命名空间,也感觉不好.  还不能调用自己建的文件夹理的类...新版本不适应症
Ⅵ真正的高手都不怎么爱写Blog,Why?
不屑于写这些简单的东西可能,但这些东西又都是菜鸟必须掌握的,所以,我要把我学到的东西写下来,与初学者同进.
Ⅶ里面还有点东西没有办法写出来,只能靠菜鸟自己领悟了.
Ⅷ这种方法涉及到了IHttpHandler接口,对它有了初步的了解,


【没完没了】
感觉这种方法还是不是很简洁,下篇我将用RewritePath()方法重写实现该功能.

咱们下回书接着说,敬请期待!

【追加】有发现个好资源,写的挺深刻,就是有点长.我看到最后都没信心了.
http://www.aspxboy.com/484/archive.aspx

你可能感兴趣的:(使用IHttpHandler接口实现【不同路径+任意URL后缀重写到指定页面且URL地址不变】(附源码)_AX...)