<rewrite url="^/User/(/d+)$" to="~/User. " /> 免费观看美女的网站,男人电影天堂手机,欧美亚洲国产手机在线有码

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

重提URL Rewrite(3):在URL Rewrite后保持PostBack地址

  在進(jìn)行了URL Rewrite之后,經(jīng)常會(huì)遇到的問(wèn)題就是頁(yè)面中PostBack的目標(biāo)地址并非客戶(hù)端請(qǐng)求的地址,而是URL Rewrite之后的地址。以上一篇文章中的重寫(xiě)為例:

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

  當(dāng)用戶(hù)請(qǐng)求“/User/jeffz”之后,頁(yè)面中的出現(xiàn)的代碼卻會(huì)是

,這是因?yàn)樵谏纱a時(shí),頁(yè)面會(huì)使用當(dāng)前Request.Url.PathAndQuery的值來(lái)得到form元素的action。這導(dǎo)致了一旦PostBack,地址欄里就會(huì)出現(xiàn)“User.ASPx?name=jeffz”,而這個(gè)地址很可能是請(qǐng)求不到正確的資源的(因?yàn)榭赡鼙籖ewrite到了別處,或者由于目錄級(jí)別的關(guān)系而根本沒(méi)有該資源)。在之前《UpdatePanel與UrlRewrite》一文中,我說(shuō)可以在頁(yè)面末尾添加一行JavaScript代碼來(lái)解決這個(gè)問(wèn)題:

 

<script language="Javascript" type="text/Javascript">
    document.getElementsByTagName("form")[0].action = window.location;
script>

  這行代碼的意圖非常明顯,將form的action修改為window.location(即瀏覽器地址欄中的路徑),這樣當(dāng)頁(yè)面進(jìn)行PostBack時(shí),目標(biāo)地址就會(huì)是URL Rewrite之前的地址了。這種做法能夠讓程序正常運(yùn)行,但是實(shí)在不能讓我滿(mǎn)意。為什么?

  因?yàn)樘罅恕?/p>

  因?yàn)槲覀冞€是把URL Rewrite之后的地址暴露給了客戶(hù)端。用戶(hù)只要裝一個(gè)HTTP嗅探器(例如著名的Fiddler),或者在IE中直接選擇查看源文件,我們的目標(biāo)地址就毫無(wú)遮掩的顯示在用戶(hù)面前了。怎么能讓用戶(hù)知道我們的重寫(xiě)規(guī)則?我們必須解決這個(gè)問(wèn)題。解決的方法很簡(jiǎn)單,也已經(jīng)非常流行了,那就是使用Control Adaptor來(lái)改變Form生成時(shí)的行為。不過(guò)讓我感到比較奇怪的是,關(guān)于這個(gè)Control Adaptor,在網(wǎng)絡(luò)上搜到的盡是VB.NET的版本,倒是微軟主推的C#語(yǔ)言卻找不到。雖然只要了解一點(diǎn)VB.NET的語(yǔ)法要改寫(xiě)起來(lái)并不困難,但是畢竟也是個(gè)額外的工作啊。所以我現(xiàn)在就將這個(gè)Adaptor的C#版本代碼貼出來(lái),以便朋友們能夠直接使用:

namespace Sample.Web.UI.Adapters
{
    public class FormRewriterControlAdapter :
        System.Web.UI.Adapters.ControlAdapter

    {
        protected override void Render(HtmlTextWriter writer)
        {
            base.Render(new RewriteFormHtmlTextWriter(writer));
        }
    }
 
    public class RewriteFormHtmlTextWriter : HtmlTextWriter
    {
        public RewriteFormHtmlTextWriter(HtmlTextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer.InnerWriter;
        }
 
        public RewriteFormHtmlTextWriter(TextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer;
        }
 
        public override void WriteAttribute(string name, string value, bool fEncode)
        {
            if (name == "action")
            {
                HttpContext context = HttpContext.Current;
 
                if (context.Items["ActionAlreadyWritten"] == null)
                {
                    value = context.Request.RawUrl;
                    context.Items["ActionAlreadyWritten"] = true;
                }
            }
 
            base.WriteAttribute(name, value, fEncode);
        }
    }
}

  簡(jiǎn)單的說(shuō),這個(gè)Control Adaptor其實(shí)一直在等待“action”這個(gè)屬性被輸出的那一刻,將value變?yōu)楫?dāng)前Request對(duì)象的RawUrl屬性。這個(gè)屬性在ASP.NET剛接受到IIS傳來(lái)的請(qǐng)求時(shí)就確定了,它不會(huì)隨著接下來(lái)BeginRequest中的Rewrite操作而改變,因此我們只要為Form的action輸出RawUrl就可以解決PostBack地址改變這個(gè)問(wèn)題了。

  不過(guò)要讓這個(gè)Control Adaptor生效,還必須在Web項(xiàng)目中創(chuàng)建一個(gè)browser文件,例如“App_Browsers/Form.browser”,在里面寫(xiě)入如下代碼:

<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
               adapterType="Sample.Web.UI.Adapters.FormRewriterControlAdapter" />
    controlAdapters>
  browser>
browsers>

  至此,在ASP.NET層面上作URL Rewrite導(dǎo)致PostBack地址改變的問(wèn)題已經(jīng)完美解決了——等等,為什么要強(qiáng)調(diào)“ASP.NET層面”?沒(méi)錯(cuò),因?yàn)槿绻贗IS層面上作URL Rewrite,這個(gè)問(wèn)題依舊存在。例如您使用了IIRF做URL Rewrite,并讓上面的Control Adapter生效,還是會(huì)發(fā)現(xiàn)頁(yè)面上PostBack的地址和客戶(hù)端請(qǐng)求的地址不同。難道RawUrl也變得“不忠誠(chéng)”了?這不是RawUrl的緣故,而是ASP.NET機(jī)制所決定的。為了解釋這個(gè)問(wèn)題,我們重新看一下在第一篇文章《IIS與ASP.NET》中那幅示意圖:

  IIS級(jí)別的URL Rewrite發(fā)生在上面這幅圖中步驟2之前,正因?yàn)楸恢匦翿ewrite了,所以IIS的ISAPI選擇器才會(huì)將該請(qǐng)求交給ASPNET ISAPI處理。換句話說(shuō),當(dāng)IIS把請(qǐng)求交由ASP.NET引擎處理的時(shí)候,ASP.NET從IIS那里獲得的信息中已經(jīng)是URL Rewrite之后的地址了(例如/User.ASPx?name=jeffz),這樣無(wú)論在ASP.NET處理該請(qǐng)求的哪個(gè)環(huán)節(jié),都無(wú)法得知IIS當(dāng)初收到請(qǐng)求時(shí)的URL。

  也就是說(shuō),其實(shí)真沒(méi)辦法了。

  不過(guò)“真沒(méi)辦法”四個(gè)字是有條件的,完整地說(shuō)應(yīng)該是:“靠ASP.NET自身”的確“真沒(méi)辦法”了。不過(guò)如果IIS在進(jìn)行URL Rewrite的時(shí)候幫我們一把,那么情況又會(huì)如何呢?IIRF作為一個(gè)成熟的開(kāi)源組件,它自然知道ASP.NET引擎,乃至所有的ISAPI處理程序都需要它的幫助,它自然知道“改出手時(shí)就出手”的道理,因此它練就了將原始地址存放在服務(wù)器變量HTTP_X_REWRITE_URL之中的能力。不過(guò)IIRF也不會(huì)“自覺(jué)”地這么做(多累啊),這還要我們?cè)谂渲梦募刑嵝阉?/p>

RewriteRule    ^/User/(/d+)$    /User.ASPx?id=$1      [I, L, U]
RewriteRule    ^/User/(/w+)$    /User.ASPx?name=$1    [I, L, U]

  請(qǐng)注意,我們使用了額外的Modifier。在Modifier集合中加入U(xiǎn)表明我們需要IIRF將URL Rewrite之前的原始地址存放在服務(wù)器變量HTTP_X_REWRITE_URL中。現(xiàn)在我們就可以在ASP.NET獲取到這個(gè)值了,于是我們將之前的Control Adapter代碼中的WriteAttribute方法作如下修改:

public override void WriteAttribute(string name, string value, bool fEncode)
{
    if (name == "action")
    {
        HttpContext context = HttpContext.Current;
 
        if (context.Items["ActionAlreadyWritten"] == null)
        {
            value = context.Request.ServerVariables["HTTP_X_REWRITE_URL"]
                ?? context.Request.RawUrl;
            context.Items["ActionAlreadyWritten"] = true;
        }
    }
 
    base.WriteAttribute(name, value, fEncode);
}

  現(xiàn)在action的value已經(jīng)不是簡(jiǎn)單地從RawUrl屬性中獲取了,而是設(shè)法從ServerVariables集合中取得HTTP_X_REWRITE_URL變量的值,因?yàn)槟抢锎娣帕薎IS所接受到的原始請(qǐng)求的地址。

  至此,有關(guān)URL Rewrite的主要話題已經(jīng)講完了,在下一篇,也就是本系列的最后一篇文章中,我們將重點(diǎn)看一下使用不同層面的URL Rewrite會(huì)在一些細(xì)節(jié)方面造成什么樣的區(qū)別,以及相關(guān)的注意點(diǎn)。

相關(guān)鏈接:

(1)IIS與ASP.NET

(2)使用已有組件進(jìn)行URL Rewrite

(4)不同級(jí)別URL Rewrite的一些細(xì)節(jié)與特點(diǎn)

NET技術(shù)重提URL Rewrite(3):在URL Rewrite后保持PostBack地址,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产美女裸身网站免费观看视频 | 无码精品AV久久久奶水 | 天海翼精品久久中文字幕 | 佐山爱巨大肥臀在线 | 久久精品麻豆国产天美传媒果冻 | 激情内射亚洲一区二区三区 | 深喉吞精日本 | 久久亚洲午夜牛牛影视 | 青青草A在在观免费线观看 青青草AV国产精品 青青草 久久久 | 国产嫩草在线观看 | 国产精品一国产AV麻豆 | 掀开奶罩边躁狠狠躁软学生 | 国产精品18久久久久久欧美 | 久久天天综合 | 久久99精品国产自在自线 | 亚洲精品日韩在线观看视频 | 免费国产成人手机在线观看 | 精品国内自产拍在线观看视频 | 夫外出被公侵犯日本电影 | 狠狠操天天操夜夜操 | 18禁黄无遮挡禁游戏在线下载 | 99久久久无码国产精品不卡按摩 | 国产伦子沙发午休系列资源曝光 | yin荡体育课羞耻play双性 | 色欲AV亚洲午夜精品无码 | 亚洲、国产综合视频 | 一二三区乱码不卡手机版 | 成人国产AV精品久久久久 | 日韩精品人成在线播放 | 暖暖日本免费播放 | 老师给美女同学开嫩苞 | 热久久免费频精品99热 | 9久爱午夜视频 | 成人免费一级毛片在线播放视频 | 免费夜色污私人影院网站 | 青草久久精品亚洲综合专区 | 美女教师朝桐光在线播放 | 999久久久国产精品蜜臀AV | 中文字幕一区二区视频 | 国产精品九九九久久九九 | 超碰97av 在线人人操 |