asp.net利用自定义Http处理程序实现URL伪静态之初探
2015-07-08 11:59
519 查看
之前在做过的一个项目中,也实现了伪静态URL页面的办法,不过那是利用URLRewriter.dll并需要通过配置IIS才得以实现,而且通过这个方法实现还有不少要求,但在实际过程中,服务器我们是买别人家公司的,并不能实现登录虚拟机进行配置IIS,甚至如果服务器供应商都不提供有支持.framework 4.0,那这实现又从何说起?!
近日看了一些HTTP管道的文章,看了上面的例子,突然想到,既然asp.net请求是通过Http管道来处理的,那为何不用它来实现伪静态化呢?于是就动手写了一个例子,发现结果还是可以的,所以拿出来分享一下:
实现自定义的Http管道处理程序我们需要自己定义一个继承IHttpHandler接口的类,主要实现一个方法跟一个属性,例如,我定义了一个Redir类:
然后在Web.Config文件中进行注册这个HttpHandler
这个类其实处理过程很简单:
就是当有一个后缀不为.aspx的请求发送到这个HttpHandler后,假设有一个请求如下:http://www.***.com/Article-dpan-20.shtml
这个请求发送过来,能过上下文对象中的Request.RawUrl我们可以得到一个原始请求:/Article-dpan-20.shtml
后缀部份,我们不要,进行截尾处理变成/Article-dpan-20。然后我们需要做的就是根据'-'分隔的参数值获取出来,所以通过String.Split方法,分割成了:
(1)/Article
(2)dpan
(3)20
剩下的工作就好做了,重新进行拼接起来就行了,所以变成了,/Article.aspx?name=dpan&id=20。通过内部转移Transfer方法将这个URL发送给对应的指定页面就OK了。
这种重写的方法显然没有那种 /Article/dpan/20.html 这种形式来得优雅,我也尝试着进行转化处理,发现有几个问题没办法处理:
(1)因为网站后台使用的是在线的HTML编辑器,这种编辑器会有自带的生成的.html页面,如果后缀使用了.html来进行伪静态,导致后台HTML编辑器无法正常使用。
(2)在注册httpHandlers中的path属性,并不能认可像 /Article/*/*.shtml 这种形式的路径请求,个人猜测是在WindowForm开发下,文件映射的问题吧,具体的还没有仔细研究过,也对Web.Config研究不深,还需仔细去找资料查看看。
目前通过这种形式来实现伪静态化也算是能满足一些需求吧,因为之前的网站,要不是客户自己买有云服务器,可以登录上去进行配置IIS,我都不知道如何在我们自己服务器供应商提供的只支持.framework 3.5而且也不准配置IIS这种情况下实现伪静态化了,现在通过这个自定义的扩展Http程序,也算是可以做到了。
但我有找到很多人介绍说通过HttpModules截获Http请求进行处理,而且HttpModules是可以调用好几个的的,而HttpHandles只能调用一个。具体的还没有去研究过,接下来又有得忙啦!
近日看了一些HTTP管道的文章,看了上面的例子,突然想到,既然asp.net请求是通过Http管道来处理的,那为何不用它来实现伪静态化呢?于是就动手写了一个例子,发现结果还是可以的,所以拿出来分享一下:
实现自定义的Http管道处理程序我们需要自己定义一个继承IHttpHandler接口的类,主要实现一个方法跟一个属性,例如,我定义了一个Redir类:
<pre name="code" class="csharp">public class Redir :IHttpHandler { /// <summary> /// 当有重复的请求时,是否重用这个资源对象 /// </summary> public bool IsReusable { get { return true; } } /// <summary> /// 请求进程处理 /// </summary> /// <param name="context"></param> public void ProcessRequest( HttpContext context ) { string RawUrl = context.Request.RawUrl; //获取当前请求原始URL //因为后缀为.html或是.shtml和.htm,我们需要进行截取并根据'-'进行分段,以便获得参数值 string[] Paras = RawUrl.Substring( 0, RawUrl.IndexOf( '.' ) ).Split( new char[] { '-', '/' }, StringSplitOptions.RemoveEmptyEntries ); string RebulidParas = ""; //根据获得参数的数量进行相应的处理 switch ( Paras.Length ) { case 2: RebulidParas = "?name=" + Paras[1]; break; case 3: RebulidParas = "?name=" + Paras[1] + "&id=" + Paras[2]; break; default: break; } //然后在服务器内部进行重新发送这个转化过的url,注意后缀恢复成了原来的.aspx, context.Server.Transfer( Paras[0] +".aspx" + RebulidParas ); } }
然后在Web.Config文件中进行注册这个HttpHandler
<system.web> <httpHandlers> <add verb="*" path="*.shtml" type="空间名.类名,程序集名"/> </httpHandlers> </system.web>
这个类其实处理过程很简单:
就是当有一个后缀不为.aspx的请求发送到这个HttpHandler后,假设有一个请求如下:http://www.***.com/Article-dpan-20.shtml
这个请求发送过来,能过上下文对象中的Request.RawUrl我们可以得到一个原始请求:/Article-dpan-20.shtml
后缀部份,我们不要,进行截尾处理变成/Article-dpan-20。然后我们需要做的就是根据'-'分隔的参数值获取出来,所以通过String.Split方法,分割成了:
(1)/Article
(2)dpan
(3)20
剩下的工作就好做了,重新进行拼接起来就行了,所以变成了,/Article.aspx?name=dpan&id=20。通过内部转移Transfer方法将这个URL发送给对应的指定页面就OK了。
这种重写的方法显然没有那种 /Article/dpan/20.html 这种形式来得优雅,我也尝试着进行转化处理,发现有几个问题没办法处理:
(1)因为网站后台使用的是在线的HTML编辑器,这种编辑器会有自带的生成的.html页面,如果后缀使用了.html来进行伪静态,导致后台HTML编辑器无法正常使用。
(2)在注册httpHandlers中的path属性,并不能认可像 /Article/*/*.shtml 这种形式的路径请求,个人猜测是在WindowForm开发下,文件映射的问题吧,具体的还没有仔细研究过,也对Web.Config研究不深,还需仔细去找资料查看看。
目前通过这种形式来实现伪静态化也算是能满足一些需求吧,因为之前的网站,要不是客户自己买有云服务器,可以登录上去进行配置IIS,我都不知道如何在我们自己服务器供应商提供的只支持.framework 3.5而且也不准配置IIS这种情况下实现伪静态化了,现在通过这个自定义的扩展Http程序,也算是可以做到了。
但我有找到很多人介绍说通过HttpModules截获Http请求进行处理,而且HttpModules是可以调用好几个的的,而HttpHandles只能调用一个。具体的还没有去研究过,接下来又有得忙啦!
相关文章推荐
- HLS(http live streaming) m3u8自制
- android Http请求方式
- Servlet发送Http请求
- 网络连接底层工具类,执行get和post请求(用于在一个项目中去对另外项目发出请求)
- Linux常用网络工具:Http压力测试之ab
- Linux网络驱动程序
- 基于事件的开源网络库—libevent:应用实例
- 基于事件的开源网络库—libevent:应用介绍
- HttpUrlConnection的setDoOutput与setDoInput的区别
- iOS 9适配系列教程:改用更安全的HTTPS
- python发送HTTP请求的方法小结
- 网络代理服务Agent,服务端.client 连接server 进行通信
- Android网络框架Volley
- Linux网络编程之原始套接字
- 青云QingCloud业内率先支持云端全面透明代理功能 | SDNLAB | 专注网络创新技术
- 快速搭建FTP服务器 by:http://cyr520.blog.51cto.com
- iOS 网络编程 XMPP编程
- libevent参考手册第九章:连接监听器:接受TCP连接 (十一)
- 使用Libevent的快速可移植非阻塞网络编程:异步IO简介 (一)
- Linux 下 ngnix 搭建 http 服务器