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的時候就用不着了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM