urlMappings與URL映射

此配置節的做用就是往Web程序中添加URL的映射,從而達到用戶訪問映射後的URL(如/Page/AAA)也能訪問到源URL(如/Page/PageAAA.aspx)的效果。這也是URL映射原本的做用。 web

詳細配置以下 網絡

其中要啓用這個URL映射的必需要把enabled設置成true,add和remove的url都是映射後的URL。 app

最開始鄙人是在WebForm中嘗試,結果是成功的;而後擔憂在MVC下已經廢棄了,最開始多是某些緣由致使映射不了,直接說找不到URL,後來估計打斷點查看一下兩個應用程序(WebForm和MVC)的Application裏面都包含了UrlMappingsModule。再接着在MVC下嘗試,也不知啥緣由就映射成功了。然而也發現實際上這個URL映射就是ASP.NET的HTTP管道里面的這個模塊起的做用。 工具

對於無知的我,讓我去實現一個UrlMappingsModuel實現映射的話,多半會利用HttpResponse的Redirt經過URL重定向來從表面實現上達到這個URL映射的效果。之前剛開始學習ASP.NET的時候就以爲HttpResponse的Redirt就是頁面跳轉,瞭解到Http協議的時候才發現這兩個仍是有區別的。 學習

先弄一個重定向的例子,有一個Action他是重定向到另外一個Action——HelloWorld裏面 url

當訪問這個RedHelloWorld的時候,經過谷歌的開發者工具看到網絡請求是這樣子的 spa

   

頁面最終是訪問到HelloWorld。但是這並不是是請求RedHelloWorld的響應,其響應如上圖,狀態碼302表示重定向,經過Location裏面的"/Home/HelloWorld"字段來再次發起請求,最終顯示的頁面是HelloWorld的響應內容。 3d

(這一會兒成了在說HTTP協議的,檔次以爲下降了不少) orm

再看看URL映射的,在Web.Config中添加以下配置 blog

訪問/Abc/aaa的時候呈現的是/Home/Index的內容,其響應頭是這樣子的200 OK

爲此我也專門看了一下源碼,首先web.config裏面的配置確定是由某個以Section爲後綴的配置讀取類來獲取,那這裏的就是UrlMappingsSection。它讀取了整個映射信息後會把它們存放到一個以UrlMappingCollection爲類型、名爲UrlMappings的集合裏面

這個集合會在兩個地方被使用,一個是UrlMappingsModule,另外一個是在ApplicationStepManager裏面。這個ApplicationStepManager的具體做用我就沒去認真探究,但經過HttpApplication裏面的一點代碼推測,這是在經典模式下使用的,另外一個管道的應該是對應集成模式。這裏若是我說錯了其餘大神能夠拍磚,我很是樂意更改過來。

那說回UrlMappingsModule裏面的,他是註冊了HttpApplication的BeginRequest事件,每當有請求來的時候他都會把要請求的URL拿過去UrlMappings比對一下看存不存在映射,

   

若是存在了,那就調用HttpContext裏面的RewritePath方法去重寫此次請求的路徑,這個RewritePath是一個公共的方法

而對於HttpResponsed它就在響應頭裏面把狀態碼改爲301或302,而後註明Location字段,下圖節選自HttpResponse的內部方法Redirect重載。

實際上還有另外一種響應方式的,他是與WebForm那邊有關係的,在使用MVC的時候就用不着了

相關文章
相關標籤/搜索