<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      大叔手記(16):分析URL Routing和URL Rewriting兩者之間的不同

      2011-12-27 14:07  湯姆大叔  閱讀(11391)  評論(8)    收藏  舉報

      前言

      前面有2篇帖子提到了關于URL Routing的特性,但是發現有很多人誤會URL Routing就是URl Rewriting,其實2個雖然都提供相似的功能(提高友好的URL方便搜索引起收錄),但是2者的原理和運行周期是完全不一樣的,本篇文章我們就來分析一下具體有什么不同。

      例子

      在分析原理之前,我們先來做一個例子測試一下(IIS URL Rewrite模塊需要IIS7的支持)。

      1.為Customer/1的URL建立對應的MVC程序

      首先建立一個普通的MVC3程序,建立一個簡單的CustomerController以及一個簡單的Detail action,代碼如下:

      public class CustomerController : Controller
      {
      public ActionResult Detail(string id)
      {
      ViewBag.CustomerID = id;
      return View();
      }
      }

      我們只是簡單的接受一個ID,然后放到ViewBag里以便在view里顯示,view的代碼如下:

      @{
      Layout = null;
      }
      <!DOCTYPE html>
      <html>
      <head>
      <title>Detail</title>
      </head>
      <body>
      <div>
      MVC下運行結果:@ViewBag.CustomerID
      </div>
      </body>
      </html>

      2.為Customer/1的URL建立對應的web form程序

      在同一個解決方案的根目錄下,建立一個Customer.aspx文件,文件代碼主要是接受一個ID參數然后顯示在頁面上,代碼:

          public partial class Customer : System.Web.UI.Page
      {
      protected void Page_Load(object sender, EventArgs e)
      {
      this.lblId.InnerText = Request.QueryString["id"];
      }
      }

      html:

          <form id="form1" runat="server">
      <div>
      asp.net web form下是:<label runat="server" id="lblId"></label>
      </div>
      </form>

      OK,我們先在Global.asax.cs里配置Customre/1的route,代碼如下:

      routes.MapRoute(
      "CustomerDetail", // Route name
      "Customer/{id}", // URL with parameters
      new { controller = "Customer", action = "Detail", id = UrlParameter.Optional }
      );

      編譯訪問,運行http://localhost/customer/123,頁面顯示結果是:

      MVC下運行結果:123。

      3.安裝IIS URL Rewrite

      到如下地址下載并安裝IIS URL Rewrite,http://www.iis.net/download/URLRewrite 成功安裝以后,在MVC項目的web.config里配置一條URL重寫規則,代碼如下(注意是system.webServer節點哦):

        <system.webServer>
      <validation validateIntegratedModeConfiguration="false"/>
      <modules runAllManagedModulesForAllRequests="true"/>
      <directoryBrowse enabled="true" />
      <rewrite>
      <rules>
      <rule name="rewrite customer">
      <match url="^customer/([0-9]+)" />
      <action type="Rewrite" url="customer.aspx?id={R:1}" />
      </rule>
      </rules>
      </rewrite>
      </system.webServer>

      該規則的意思是,將customer/1類似的請求重寫到customer.aspx?id=1上,我們編譯程序再來訪問以下http://localhost/customer/123,頁面顯示結果如下:
      asp.net web form下是:123

      也就是說Routing在這個時候沒起作用,因為URL Rewrite是在Routing之前將Customer/123這個地址轉發到了Customer.aspx?id=123,由aspx文件接收請求了。我們來看看2者之間到底都是在什么周期處理的。

      原理周期

      1. URL Rewrite

      關于URL Rewrite最早見于apache web server,當時風靡一時的url重寫讓一大批使用php的人欣喜若狂啊,可惜之前由于asp.net下的實現方式特別復雜,所以很多站的基本上都沒怎么用,自從IIS.net推出正式的IIS URL Rewrite模塊以來,徹底解決了這一問題。

      URL Rewrite是在request-processing pipeline的早期階段執行的,一般一個地址進來以后,該模塊會根據規則來映射到同一服務器上的另外一條新的地址,新地址在處理的時候所接受的參數和數據都是一句新地址的參數來判斷的,就比如customer.aspx?id=123,而 request里的url也是新的地址,而不是重寫之前的地址,不過用戶本身感覺不到變化,因為瀏覽器上顯示的一直是舊URL,我們來看一下他的周期圖。

      URL Rewrite module是一個native的模塊,從圖可以看到他的運行周期是在Pre-begin RquestBegin Request之間,該模塊在根據請求的URL進行規則匹配之后,最終處理新的URL以便進入IIS pipeline的剩余周期里進行處理,就是說處理請求的HttpHandler是根據重寫以后的新URL來決定的。

      2. URL Routing

      URL Routing的原理是根據現有的URL來定義規則,定義每個規則所對應的HttpHandler,其本質和URL是否友好沒有關系,只是按照統一的規則去調用相對應的HttpHandler而已,找到對應的HttpHandler,處理完以后就返回結果,找不到就暴資源錯誤。

      Routing是托管代碼模塊,是在Resolve Cache周期( PostResolveRequestCache事件)里注冊,然后在MapHandler周期內處理的。在PostResolveRequestCache事件里,該模塊查詢靜態集合routing表里的所有記錄里聲明的URL匹配規則,如果當前URL對應到了一個匹配的Handler,然后就使用該Handler處理結果并輸出。

      兩者之間的不同

      1. URL Rewrite是在request處理之前修改相應的URL,URL Rewrite模塊本身不知道哪個HttpHandler處理這個請求,并且處理請求的HttpHandler也不知道自己處理的URL是原來的URL還是被重寫過的地址。
      2. 和URL Rewrite正好相反,URL Routing是根據規則為URL來指定HttpHandler的,可以看做Routing是handler的高級映射。
      3. IIS URL Rewrite可以用于任何web程序的映射處理,包括但不限于asp.net,php,asp和靜態文件等,但Routing只能處理基于.net的web程序。
      4. IIS URL Rewrite在IIS集成模式和經典模式都可以用,但默認情況下Routing只能用在集成模式下,經典模式的話需要使用擴展名或者通配符將程序映射到IIS上(其實.net有另外一個組件aspnetfilter已經幫我們做好了)。
      5. IIS URL Rewrite可以根據域名,路徑,Http Header,server變量等處理重寫規則,但Routing只能按照請求的URL路徑和HTTP-Method header來處理。
      6. IIS URL Rewrite可以執行處理HTTP跳轉,處理自定義的Status Code以及Abort請求,但Routing做不到這些。
      7. IIS URL Rewrite的擴展只能擴展自己的Provider來自定義規則的存儲,但Routing的擴展相對來說就非常強大了,MVC就是其中一種。

      總結

      兩者之間有這么多不同,那我們到底該用哪一個呢?

      如果你的程序是用asp.net之外的平臺構建的,那你只能使用IIS URL Rewrite了,否則,我們建議的規則是:

      1. 如果你在用asp.net構建新的asp.net web程序,那就使用Routing,因為現在Routing不僅支持MVC了,也支持web form了。
      2. 如果你的asp.net web form程序已經是現成的了,并且不想修改了,那就使用URL Rewrite,它可以幫你改善搜索引擎優化。

      當然,你也可以兩者結合起來一起用,但是用之前一定要記得上面的圖里所說明的內容:他們的執行周期不一樣。

      參考地址:http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

      同步與推薦

      本文已同步至目錄索引:《大叔手記全集》

      大叔手記:旨在記錄日常工作中的各種小技巧與資料(包括但不限于技術),如對你有用,請推薦一把,給大叔寫作的動力。

      主站蜘蛛池模板: 亚洲人成日韩中文字幕不卡| 亚洲av影院一区二区三区| 国产精品久久久福利| 精品三级在线| 亚洲国产成人极品综合| 和黑人中出一区二区三区| 永嘉县| 18禁视频一区二区三区| 国产午精品午夜福利757视频播放| 久章草在线毛片视频播放 | 又粗又硬又黄a级毛片| 最新av中文字幕无码专区| 狠狠色丁香婷婷综合尤物| 夜夜爽77777妓女免费看| 色欲色香天天天综合网站免费| 国产情侣激情在线对白| 中国极品少妇videossexhd| 亚洲综合伊人五月天中文| 国产一区二区一卡二卡| 国产福利在线观看免费第一福利 | 国产精品一在线观看| 国产成人亚洲精品成人区| 久久这里都是精品二| 少妇激情a∨一区二区三区| 炉霍县| 羞羞影院午夜男女爽爽免费视频| 五月婷婷中文字幕| 天天做日日做天天添天天欢公交车 | 国产精品免费看久久久| 久久亚洲人成网站| 国产高清在线精品一区不卡| 亚洲国产成人精品av区按摩| 精品一区二区三区自拍图片区| 亚洲综合国产精品第一页| 日韩中文字幕精品人妻| 邻居少妇张开腿让我爽了一夜| 一区二区三区岛国av毛片| 天堂a无码a无线孕交| 国产精品一区二区黄色片| 日本一区不卡高清更新二区| 国产在线中文字幕精品|