现在的位置: 首页 > 综合 > 正文

微软提供的URL Rewrite与Intelligencia的UrlRewrite.Net 

2019年05月10日 ⁄ 综合 ⁄ 共 3175字 ⁄ 字号 评论关闭
我以前一直都在使用微软的那个,感觉还行,最近找到一个新的组件,就是Intelligencia提供的那个了。感觉功能很多,查了许多资料,比较一下:

web.config中配置:

Url Rewrite

<configSections>
<section name="RewriterConfig"
           type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
</configSections>
<RewriterConfig>
<Rules>
    <RewriterRule>
      <LookFor>~/test/([/w]+)/</LookFor>
      <SendTo>~/test.aspx?id=$1</SendTo>
    </RewriterRule>
</Rules>
</RewriterConfig>
<httpModules>
<system.web>
<add name="ModuleRewriter"
       type="URLRewriter.ModuleRewriter, URLRewriter" />
</httpModules>
</system.web>

UrlRewrite.net

<configSections>
<section name="rewriter"
           type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler,
                 Intelligencia.UrlRewriter" />
</configSections>

<rewriter>
<rewrite url="^/User/(/d+)$" to="~/User.aspx?id=$1" processing="stop" />
<rewrite url="^/User/(/w+)$" to="~/User.aspx?name=$1" processing="stop" />
</rewriter>

<system.web>
<httpModules>
    <add name="UrlRewriter"
         type="Intelligencia.UrlRewriter.RewriterHttpModule,
               Intelligencia.UrlRewriter" />
</httpModules>
</system.web>

UrlRewriter.NET在找到一个匹配的重写规则时,不会就此停止,而会继续寻找其余的匹配项,最终生效的则是能够匹配当前请求的最后一个重写规
则。如果我们需要UrlRewriter.NET在找到某个匹配项之后即生效,就需要将processing属性设为stop。
UrlRewriter.net还有很多的参数,这里可以查询。

from 提交时action路径还原方法:

在url rewriter中,我采用继承基类方法,在基类中添加类,并覆盖Render方法 
    internal class FormFixerHtml32TextWriter : System.Web.UI.Html32TextWriter
        {
            private string _url; // 假的URL

            internal FormFixerHtml32TextWriter(TextWriter writer):base(writer)
            {
                _url = HttpContext.Current.Request.RawUrl;
            }

            public override void WriteAttribute(string name, string value, bool encode)
            {
                // 如果当前输出的属性为form标记的action属性,则将其值替换为重写后的虚假URL
                if (_url != null && string.Compare(name, "action", true) == 0)
                {
                    value = _url;
                }
                base.WriteAttribute(name, value, encode);
            }
        }

        internal class FormFixerHtmlTextWriter : System.Web.UI.HtmlTextWriter
        {
            private string _url;
            internal FormFixerHtmlTextWriter(TextWriter writer):base(writer)
            {
                _url = HttpContext.Current.Request.RawUrl;
            }

            public override void WriteAttribute(string name, string value, bool encode)
            {
                if (_url != null && string.Compare(name, "action", true) == 0)
                {
                    value = _url;
                }
                base.WriteAttribute(name, value, encode);                

            }
        }
        protected override void Render(HtmlTextWriter writer)
        {
            if (writer is System.Web.UI.Html32TextWriter)
            {
                writer = new FormFixerHtml32TextWriter(writer.InnerWriter);
            }
            else
            {
                writer = new FormFixerHtmlTextWriter(writer.InnerWriter);
            }
            base.Render(writer);
        }

在asp.net2.0中也可以使用该方法 ,但我在2.0中使用以上方法时,页面调用时page_load会被执行两次

Intelligencia:UrlRewrite.Net
在asp.net 2.0中可在 App_Browsers 文件夹添加 BrowserFile.browser 浏览器文件并添加以下代码
   <browser refID="Default">
    
<controlAdapters>
      
<adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
                adapterType
="FormRewriterControlAdapter" />
    
</controlAdapters>
  
</browser>
这里利用新ASP.NET 2.0控件适配器的扩展架构来定制控件的输出,用你提供的值来覆盖action属性的值
不需要自己重写页面代码

抱歉!评论已关闭.