zoukankan      html  css  js  c++  java
  • 从留言簿开始,学习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之前。

    项目截图:


    本文的完整代码可以在这儿下载。
  • 相关阅读:
    Android操作系统中11种传感器的介绍【转】
    陀螺仪、加速计、磁力计【转】
    【转】在ubuntu环境下搭建svn server遇到的一些问题
    【转】Ubuntu下搭建SVN环境-Apache
    【转】Java ConcurrentModificationException 异常分析与解决方案--还不错
    【转】ConcurrentModificationException异常解决办法 --不错
    【转】Java ConcurrentModificationException异常原因和解决方法
    【转】 为SeekBar滑块设置固定值以及自定义Seekbar,progressbar样式--不错
    【转】Android自定义Adapter的ListView的思路及代码
    【转】如何开发苹果iOS操作平台下的应用程序?
  • 原文地址:https://www.cnblogs.com/fuyun/p/929610.html
Copyright © 2011-2022 走看看