UrlRewriter.NET 与 UrlRewrittingNet.UrlRewriter

UrlRewriter.NET与UrlRewritingNet.UrlRewrite是ASP.NET中做URL重写比较常用的两个组件。两者实现方式大致都差不多,都是通过HTTP Module来处理。以这种方式处理,都会遇到一个问题,就是ASP.NET的Form控件总是以重写后的URL为Postback的地址。比如:http://detail11.aspx 重写到http://detail.aspx?id=11;当postback到当前页后,地址栏里就是http://detail.aspx?id=11,而不是前者的友好地址。在解决这个问题上,两者处理方式不同,也导致了一些问题的出现。

UrlRewriter.NET重写了ASP.NET内置的Form控件,可以在页面里直接用这个控件替换掉ASP.NET Form控件,对于ASP.NET 2.0,推荐采用Control Adapter的形式,在App_Browsers目录下新建Form.browser文件,填充下面的内容:
<browsers>

<browser refID="Default">
        <controlAdapters>
            <adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
      adapterType="Intelligencia.UrlRewriter.FormRewriterControlAdapter,
Intelligencia.UrlRewriter" />
        </controlAdapters>
    </browser>

</browsers>

UrlRewritingNet.UrlRewrite的处理方式没有这么繁琐,它没有额外的配置,也不需要替换内置的Form,那它是如何解决这个问题的呢?查看源码大致可以看出,它在重写了URL到目标page handler之后,在page初始化之前,又将URL重写回了原始的friendly URL,它是通过处理Page.PreInit事件来处理的。所以整个过程发生了两次重写,先是在页面生命周期早期的BeginRequest阶段,把原始URL重写到目标URL,在目标URL对应的Page Handler开始执行后,并且在所有控件初始化之前(Page.PreInit事件正好在这个阶段)在把URL重写回去,这样包括Form控件在内的其他控件就是使用原始的URL了,postback时就不会发生之前所说的问题了。

但是这种方式又导致了另一个问题,ASP.NET 2.0支持跨页的Postback(cross-page postback)。但当使用了UrlRewritingNet.UrlRewrite后,访问PreviousPage时会报错,具体看这里PostBackUrl PreviousPage problem,而且这个Bug到目前还没有解决方案。我觉得,因为是对之前Fom Postback问题的处理方式导致的这个bug,所以在坚持目前方式的前提下,这个bug是没法修复的。

我一直是使用UrlRewritingNet.UrlRewrite的,直到最近发现了这个cross page postback的bug后。要解决这个问题,只能是采用与UrlRewriter.NET一样的方式。具体是,在源码中去除对Page.PreInit的处理,就是去掉下面的代码。然后,也重写一个Form控件来替代内置的Form。
private void OnAppPreRequestHandlerExecute(object sender, EventArgs e)
     {
         HttpApplication app = sender as HttpApplication;
         System.Web.UI.Page page = app.Context.CurrentHandler as System.Web.UI.Page;
         if (page != null)
         {
             page.PreInit += new EventHandler(OnPagePreInit);
         }
     }

我又尝试了一下UrlRewriter.NET,首先还没有发现它有bug,在URL匹配规则的定义上,它也要更灵活和强大,支持规则的分组,这在规则多时可以提高匹配效率。此外作者一直在更新维护,文档帮助也比较完整,而UrlRewritingNet.UrlRewrite早就没有更新了。但是对于自定义的query string的处理,以及对于物理存在的地址是否做重写的处理上,UrlRewritingNet.UrlRewrite来的更简单,全部是做内置处理了,而UrlRewriter.NET需要用户自己在定义规则时考虑这些问题,不过作者也都给出了大部分情况下的列子,用的时候千万别忘了看一下Common Rules。

最后,个人还是推荐大家使用UrlRewriter.NET,毕竟它可以解决所有的问题,而且还没有bug(有些其他的问题是通过HTTP Module来处理URL重写的共同的问题)。当然,它用起来也是相对复杂一些。

UrlRewriter.NET 与 UrlRewrittingNet.UrlRewriter比较相关推荐

  1. 使用UrlRewriter进行Url重写的完整解决方案[转]

    Setp 1: 下载UrlRewriter => http://urlrewriter.net/ Setp 2: 将其添加到Web项目的Bin目录下 Setp 3: 配置:打开web.confi ...

  2. Framework4.0 IIS7下urlrewriter设置问题

    一.Web.config配置解决办法 直接在Web.config下 加入: 1.<configSections>     <section name="rewriter&q ...

  3. .Net Intelligencia.UrlRewriter 重定向参数中文支持配置方法

    在使用.Net 官方 Url重定向组件时,发现若原地址包含中文,如:http://localhost/首页.html 重定向为:http://localhost/index.aspx?id=首页  时 ...

  4. 使用URLRewriter进行URL重写失效

    运行环境:ASP.NET 2.0 + Windows 2003 SP2       需求描述:站点中许多菜单都调用了相同的页面,通过URL参数区别不同的功能.目前客户希望进行搜索引擎优化(SEO),需 ...

  5. linux显示当前文件夹,linux 查看当前所在目录的全路径

    使用Vue.js时,对Chrome控制台的一点小心得 之前对Chrome控制台的console.log()输出没太放心上,其实仔细研究后,对工作效率有显著的提示.看下面的五段代码: console.l ...

  6. Web.config配置文件详解(新手必看)

    Web.config配置文件详解(新手必看) 花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法.很适合新手参看,由于Web.config在使用很灵活,可以自定义一些节点. ...

  7. 技巧/诀窍:在ASP.NET中重写URL(转)

    [原文地址]Tip/Trick: Url Rewriting with ASP.NET [原文发表日期] Monday, February 26, 2007 9:27 PM 经常有人请我指导应该如何动 ...

  8. 在ASP.NET中重写URL 方法三:在IIS7中使用HttpModule 实现无扩展名的URL重写

    上述的HttpModule方法在你要重写的URL含有.aspx 扩展名或者包含另一个被设置为ASP.NET处理的扩展名的情形下一切都工作.你这么做的话,不需要任何特定的服务器配置,你只要把你的应用拷贝 ...

  9. Url Rewrite 再说Url 重写

    前几天看到园子里一篇关于 Url 重写的文章<获取ISAPI_Rewrite重写后的URL> , URL-Rewrite 这项技术早已不是一项新技术了,这个话题也已经被很多人讨论过多次.搜 ...

最新文章

  1. javascript中实例方法与类方法的区别
  2. 洛谷——P1258 小车问题
  3. 蓝桥杯-安慰奶牛(java)
  4. centos7python命令_02.将python3作为centos7的默认python命令
  5. mysql page directory_【innodb】page directory的二分查找问题
  6. 模块化之SeaJS(一)
  7. WordPress多语言插件
  8. 软件测试用例(全面)
  9. python excel图表 导出word模板_使用python将Excel数据填充Word模板并生成Word
  10. Legend of Mir(传奇)官方源码学习1、运行游戏
  11. 服务器设置来电自动重启,电脑来电自动重启怎么样设置
  12. 斐波那契数列(兔子数列)
  13. 一种快速求解最大团问题的算法
  14. 百度K站“漏洞”被发现,如何预防被百度人工K站
  15. iOS 10.2 越狱更新到yalu102 beta7,很稳定,很多注意事项及修复ssh和scp连接教程
  16. Linux 监控工具之Cacti使用详解(一)
  17. 1056: 幸运数字 Python
  18. 敏捷这么久,你知道如何开敏捷发布火车吗?
  19. 2022刘仲文程聪孙迎迎--用Jensen不等式证明相对熵的非负性
  20. vmware 连接云服务器协议,vmware怎么连接云服务器

热门文章

  1. 计算机网络原理【第三章 数据链路层】课后习题答案
  2. Chem 3D软件可以改变背景吗
  3. 他博士毕业论文写了1255页,28岁评教授,38岁当院士!
  4. ERP BOM 展开方式
  5. HM-GNN:基于分子-基序异构图神经网络的分子表示学习模型
  6. java跑p_javap使用
  7. 2019-04-28 21:43:41.098 ERROR 2920 --- [nio-8888-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] :
  8. 斗地主农民手牌的58684015种可能性
  9. ElGamal加密体制
  10. 查看当前系统 jave 版本 ,Eclipse版本