AXzhz

专注ASP.NET!
        写软件的都是小姐,用软件的都是大爷。真TMD说的正确!
                嫖妓不给钱,反说被强奸!___中国共享软件的无奈!
读小学的时候大学不要钱,读大学了小学不要钱。
没工作时国家有分福利房,工作了后全是高价房!!

                        此软件能有效的破解QQ密码。(注:破解QQ密码是违法行为,请不要将软件用于违法行为)
“安得广厦千万间,大庇天下寒士俱欢颜,风雨不动安如山。”1200多年前,诗人杜甫的理想,如今被一帮享受着电脑和互联网带来的快捷生活方式的受过高等教育的大孩子憧憬着。

导航

使用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关键字进行覆盖
     至于具体的页面转向,可以按照业务逻辑,也可以使用正则表达式等,我们完全可以按照自己的需要自由发挥!

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

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

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

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

32}

33


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

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

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


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


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




⑤最最重要的一步,在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

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




⑥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的<httpHandlers>节点→如果匹配上节点的规则→调用该节点标明的类(本例中的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

posted on 2006-11-02 20:04  斧头帮少帮主  阅读(7678)  评论(18编辑  收藏  举报

Google
 
站内搜索:        
园内搜索:
金山词霸: