在研究MonoRail过程中进行了URL重定向的实验。未全面了解MonoRail的情况下,首先尝试使用ASP.NET经典方式,参考Microsoft一篇文章《在ASP.NET 中执行URL 重写》,创建UrlRewriteModule类并实现IHttpModule接口来达到我的要求。在实现该功能的同时,我将URL重定向的配置文件重Web Config中移除来,单独建立了一个URLRewriting.config的文件进行管理。

UrlRewriteModule类工作流程

初始化
从留言簿开始,学习MonoRail MVC(二)public void Init(HttpApplication context)
}

读取配置
从留言簿开始,学习MonoRail MVC(二)private void LoadConfig(string path)
通过XmlDocument直接读取XML内容,实际易用中这里必须要对配置文件进行监视,内容改动以后需要重新加载。
配置文件结构
从留言簿开始,学习MonoRail MVC(二)<?xml version="1.0" encoding="utf-8"?>
从留言簿开始,学习MonoRail MVC(二)
<urlRewriting>
从留言簿开始,学习MonoRail MVC(二)  
<rules>
从留言簿开始,学习MonoRail MVC(二)    
<rule>
从留言簿开始,学习MonoRail MVC(二)      
<lookFor>/guestbook/(\d+)/delete\.castle</lookFor>
从留言簿开始,学习MonoRail MVC(二)      
<sendTo>/guestbook/delete.castle?id=$1</sendTo>
从留言簿开始,学习MonoRail MVC(二)    
</rule>
从留言簿开始,学习MonoRail MVC(二)    
<rule>
从留言簿开始,学习MonoRail MVC(二)      
<lookFor>/guestbook/(\d+)/(\d+)/test.castle</lookFor>
从留言簿开始,学习MonoRail MVC(二)      
<sendTo><![CDATA[/guestbook/test.castle?year=$1&month=$2]]></sendTo>
从留言簿开始,学习MonoRail MVC(二)    
</rule>
从留言簿开始,学习MonoRail MVC(二)  
</rules>
从留言簿开始,学习MonoRail MVC(二)
</urlRewriting>
lookFor为需要重定向的源地址格式正则表达式,sendTo为重定向目标地址。这里配置了删除留言的URL重定向。
例如原来删除ID=2的留言记录URL路径为http://localhost/guestbook/delete.castle?id=2。现在可以写成http://localhost/guestbook/2/delete.castle

分析路径进行
从留言簿开始,学习MonoRail MVC(二)private void context_BeginRequest(object sender, EventArgs e)
}
浏览器的请求都会经过context_BeginReqeust方法,在这里分析请求的路径。UrlRewriteProcessor读取配置文件中的正则表达式过滤请求的路径,对满足条件的进行重定向。
该方法条用非常频繁,所使用的正则表达式预先编译好,存放在UrlRewriteProcessor类中,UrlRewriteProcessor类实例集合为UrlRewriteModule类的静态成员。
从留言簿开始,学习MonoRail MVC(二)private static List<UrlRewriteProcessor> processors = null;

URL重定向
从留言簿开始,学习MonoRail MVC(二)        public bool Process(HttpContext context)
使用正则表达式对符合条件的URL进行参数替换以后,调用ASP.NET的HttpContext.RewritePath(string url)方法就完成了URL重定向功能。

web.config中进行配置
要使URL重定向生效,还必须将UrlRewriteModule配置到系统中才能行。
在web.config中<system.web/>/<httpModules/>加入以下代码。
<httpModules>
    
<add name="urlRewriting" type="Lanjian.GuestBook.UrlRewriteModule, GuestBook" />  <!-- 这儿是为URL重定向而增加的配置 -->
从留言簿开始,学习MonoRail MVC(二)  
<add name="monorail" type="Castle.MonoRail.Framework.EngineContextModule, Castle.MonoRail.Framework" />
</httpModules>
从留言簿开始,学习MonoRail MVC(二)
注意我们的URL重定向HTTPModule在配置文件中,必须放在monorail之前,否则不能生效。

今天在GSpring 发表的《MonoRail学习笔记三:使用方便功能强大的routing功能》文章中了解到,MonoRail框架中的routing已经实现了该功能。
配置方法可以参考GSpring的文章。

总结

使用MonoRail框架时,URL重定向可以使用你以前习惯的或者是现有的HTTPModule模块进行处理,或者使用MonoRail的routing。参考源代码,二者实现思路是完全一样的。
同时也要注意,URL重定向配置项必须放在monorail之前。

项目截图:
从留言簿开始,学习MonoRail MVC(二)

本文的完整代码可以在这儿下载。

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-29
  • 2021-12-05
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-08-27
  • 2022-12-23
  • 2021-04-03
  • 2021-11-13
相关资源
相似解决方案