<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)系我們修改或刪除,多謝。

主站蜘蛛池模板: 99在线精品国自产拍 | 友田真希息与子中文字幕 | 播色屋97超碰在人人 | 国产亚洲精品久久综合阿香蕉 | 亚洲精品一区国产欧美 | 久久久久久电影 | 99久久伊人一区二区yy5o99 | 2021国产精品视频一区 | 飘雪在线观看免费完整版 | qvod电影| 好硬好湿好大再深一点动态图 | 国产欧美另类久久久品 | 久青草国产在线观看视频 | 成年视频国产免费观看 | 有码 亚洲 制服 国产 在线 | 这里只有精品在线视频 | 黄色天堂网站 | 日日噜噜夜夜狠狠扒开双腿 | 最近韩国HD免费观看国语 | 色一伦一情一区二区三区 | 久久伊人男人的天堂网站 | 男人私gay挠脚心vk视频 | 我的漂亮朋友在线观看全集免费 | 亚洲色综合中文字幕在线 | 伊人在线高清视频 | 精品网站一区二区三区网站 | 久久中文字幕无码A片不卡 久久中文字幕人妻熟AV女蜜柚M | 综合人妻久久一区二区精品 | 国产午夜精品AV一区二区麻豆 | 亚洲男人的天堂久久精品麻豆 | 亚洲一区在线观看无码欧美 | 永久精品视频无码一区 | 极品少妇高潮啪啪无码吴梦 | 找老女人泻火对白自拍 | 黑人巨茎vide抽搐 | 18日本人XXXXXX18| 国产欧美一区二区三区视频 | 99久久精品久久久久久清纯 | 人人啪日日观看在线 | 国产成人无码精品久久久免费69 | 91视频18|