1. 程式人生 > >urlMappings與URL對映

urlMappings與URL對映

此配置節的作用就是往Web程式中新增URL的對映,從而達到使用者訪問對映後的URL(如/Page/AAA)也能訪問到源URL(如/Page/PageAAA.aspx)的效果。這也是URL對映本來的作用。

詳細配置如下

其中要啟用這個URL對映的必須要把enabled設定成true,add和remove的url都是對映後的URL。

最開始鄙人是在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裡面

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

頁面最終是訪問到HelloWorld。可是這並非是請求RedHelloWorld的響應,其響應如上圖,狀態碼302表示重定向,通過Location裡面的"/Home/HelloWorld"欄位來再次發起請求,最終顯示的頁面是HelloWorld的響應內容。

(這一下子成了在說HTTP協議的,檔次覺得降低了很多)

再看看URL對映的,在Web.Config中新增如下配置

訪問/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的時候就用不著了