从留言簿开始,学习MonoRail MVC(二)

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

UrlRewriteModule类工作流程

初始化
public   void  Init(HttpApplication context)
{
    
try
    
{
        LoadConfig(HttpRuntime.AppDomainAppPath 
+ "UrlRewriteRule.config");
    }

    
catch (Exception ex)
    
{
        
string message = "加载Url Rewriting 配置文件失败。";
        Debug.WriteLine(message);
        Debug.WriteLine(ex.Message);
        
throw;
    }


    context.BeginRequest 
+= new EventHandler(context_BeginRequest);
}

读取配置
private   void  LoadConfig( string  path)
{
    XmlDocument doc 
= new XmlDocument();
    doc.Load(path);

    
if (processors == null)
        processors 
= new List<UrlRewriteProcessor>();
    
else
        processors.Clear();

    
string lookFor, sendTo;
    
foreach (XmlNode node in doc.SelectNodes("urlRewriting/rules/rule"))
    
{
        lookFor 
= node.SelectSingleNode("lookFor/text()").Value;
        sendTo 
= node.SelectSingleNode("sendTo/text()").Value;

        
if (!String.IsNullOrEmpty(lookFor) && !String.IsNullOrEmpty(sendTo))
            processors.Add(
new UrlRewriteProcessor(lookFor, sendTo));
    }

}

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

分析路径进行
private   void  context_BeginRequest( object  sender, EventArgs e)
{
    HttpContext context 
= HttpContext.Current;

    
if (processors != null)
    
{
        
foreach (UrlRewriteProcessor processor in processors)
        
{
            
if (processor.Process(context))
                
break;
        }

    }

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

URL重定向
         public   bool  Process(HttpContext context)
        
{
            
if (regex.IsMatch(context.Request.FilePath))
            
{
                
string newUrl = regex.Replace(context.Request.FilePath, sendTo);
                context.RewritePath(newUrl);
                
return true;
            }

            
else
            
{
                
return false;
            }

        }

使用正则表达式对符合条件的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重定向而增加的配置 -->
  
< add  name ="monorail"  type ="Castle.MonoRail.Framework.EngineContextModule, Castle.MonoRail.Framework"   />
</ httpModules >
注意我们的URL重定向HTTPModule在配置文件中,必须放在monorail之前,否则不能生效。

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

总结

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

项目截图:


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

转载于:https://www.cnblogs.com/fuyun/archive/2007/10/18/929610.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值