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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

③回到IhttpHandler项目中,修改Web.config文件,添加<httpHandlers>节点,如下,注意,是添加节点,下面非完整代码,只是示意在哪个节点下添加该节点.
<httpHandlers> 配置节中的项具有三个属性,如下表中所示。
属性 | 说明 |
---|---|
路径 | 路径属性可以包含单个 URL 路径或简单的通配符字符串(例如 *.aspx)。 |
类型 | 指定逗号分隔的类/程序集组合。ASP.NET 首先在应用程序的专用 \bin 目录中搜索程序集 DLL,然后在系统程序集缓存中搜索程序集 DLL。 |
谓词 | 谓词列表可以是逗号分隔的 HTTP 方法列表(例如“GET, PUT, POST”),也可以是开始脚本映射(例如通配符 * [星号])。 |

2

3

4

5

6

7

④在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
少帮主的斧头好久不饮血了!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架