1. 程式人生 > >MVC之前的那點事兒系列(10):MVC為什麼不再需要註冊萬用字元(*.*)了?

MVC之前的那點事兒系列(10):MVC為什麼不再需要註冊萬用字元(*.*)了?

文章內容

很多教程裡都提到了,在部署MVC程式的時候要配置萬用字元對映(或者是*.mvc)到aspnet_ISPAI.dll上,在.NET4.0之前確實應該這麼多,但是.NET4.0之後已經不要再費事了,因為它預設就支援了。

你可以會問,沒有對映配置,請求這麼可能會走到aspnet_ISPAI.dll上呢?對,這就是我們本章節要講的一個東西:ASP.NET 4 Extensionless URL feature,因為在ASP.NET4之後,預設所有的請求都轉向到aspnet_ISPAI.dll,那麼在IIS6上它是如何實現的呢?首先ASP.NET4.0安裝的時候會自動安裝一個aspnet_filter.dll ,這是一個ISAPI篩選器,該篩選器在請求處理之前,會將所有的URL地址附加上/eurl.axd/GUID

字串,而預設情況下*.axd副檔名是對映到aspnet_isapi.dll上的,所以當我們附加/eurl.axd/GUID字串以後,所有的請求都可以被aspnet_isapi.dll來處理了,當進入ASP.NET的時候的時候又把該/eurl.axd/GUID 字串刪除了(這個週期非常早),以便還原成原來的URL地址。.NET框架根目錄下的web.config預設設定請求是DefaultHttpHandler來處理的,因為它的path=”*”,並且放在httpHandlers的第一個位置上(除非你修改了設定),此後DefaultHttpHandler將這個請求轉發(不是URL跳轉哦)至IIS上,這時候我們的篩選器不會再附加/eurl.axd/GUID
字串了,接下來就是正常的處理請求了,如果你想利用此特性做其它特殊的事情,那你需要在MapRequestHandler事件執行之前,修改DefaultHttpHandler為其它的HttpHandler。

有一點需要注意的是,IIS7整合模式下,處理請求的預設Handler是不是DefaultHttpHandler而是TransferRequestHandler,兩個Hanlder是差不多的,具體的細節不同不在我們討論的範疇,我們就不多說了,這些handler預設是隨.NET4.0安裝的時候一起安裝,但是IIS7預設是不啟用這個功能的,只有在安裝了IIS7的QFE才能使用,QFE包含在service pack中,QFE獨立下載地址為http://support.microsoft.com/kb/980368。

另外,要保持這個功能正常使用的話,下列設定需要滿足條件:

  1. EnableExtensionlessUrls沒定義或者是設定值為1。
  2. v4.0 aspnet_filter.dll正常註冊到到IIS上作為ISPAI篩選器。
  3. v4.0 aspnet_isapi.dll處理.axd副檔名的請求,也就是.axd對映到 aspnet_ISPAI.dll上。
  4. v4.0 aspnet_isapi.dll在ISPAI限制列表裡設定為允許Allowed。
  5. 網站設定為可讀,並且有指令碼許可權。

在IIS6上要想禁用這個功能,修改登錄檔檔案HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\4.0.30319.0\EnableExtensionlessUrls為0就可以實現,因為IIS只有重啟的時候才載入這個配置,所以需要重啟一下才能生效。Wow64下(比如64為OS下允許32位worker process)則需要設定HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\4.0.30319.0\EnableExtensionlessUrls為0.

IIS 6, ASP.NET 4, 和ASP.NET MVC 3可以成功使用上述功能(甚至MVC2也可以,MVC1未測試),所以,以後在ASP.NET4.0上部署站點的時候,不必再設定萬用字元對映就可以使用MVC3功能了。

參考資料:

同步與推薦

MVC之前的那點事兒系列文章暫時結束,關於MVC正式的部分,希望有時間陸續貼上來。

相關推薦

MVC之前事兒系列10MVC為什麼不再需要註冊字元*.*

文章內容 很多教程裡都提到了,在部署MVC程式的時候要配置萬用字元對映(或者是*.mvc)到aspnet_ISPAI.dll上,在.NET4.0之前確實應該這麼多,但是.NET4.0之後已經不要再費事了,因為它預設就支援了。 你可以會問,沒有對映配置,請求這麼可能會走到aspnet_ISPAI.dll

Java基礎系列三十七泛型繼承,字元,泛型反射

泛型型別的繼承規則 首先,我們來看一個類和它的子類,比如 Fruit 和 Apple。但是Pair<Apple>是Pair<Fruit>的一個子類麼?並不是。比如下面的這段程式碼就會編譯失敗: Apple[] apples = ...; Pair<F

MVC之前事兒系列8UrlRouting的理解

文章內容 根據對Http Runtime和Http Pipeline的分析,我們知道一個ASP.NET應用程式可以有多個HttpModuel,但是隻能有一個HttpHandler,並且通過這個HttpHandler的BeginProcessRequest(或ProcessRequest)來處理並返回請求,前

MVC之前事兒系列1:進入CLR

MVC之前的那點事兒系列,是筆者在2012年初閱讀MVC3原始碼的時候整理的,主要講述的是從HTTP請求道進入MVCHandler之前的內容,包括了原創,翻譯,轉載,整理等各型別文章,當然也參考了部落格園多位大牛的文章,對此表示感謝,這次有時間貼出來,希望對大家有用。 主要內容 本文講解的是:伺服器接受H

MVC之前事兒系列7WebActivator的實現原理詳解

文章內容 上篇文章,我們分析如何動態註冊HttpModule的實現,本篇我們來分析一下通過上篇程式碼原理實現的WebActivator類庫,WebActivator提供了3種功能,允許我們分別在HttpApplication初始化之前,之後以及ShutDown的時候分別執行指定的程式碼,示例如下: [

MVC之前事兒系列9MVC如何在Pipeline中接管請求的?

文章內容 上個章節我們講到了,可以在HttpModules初始化之前動態新增Route的方式來自定義自己的HttpHandler,最終接管請求的,那MVC是這麼實現的麼?本章節我們就來分析一下相關的MVC原始碼來驗證一下我們的這個問題。 先建立一個MVC3的Web Application,選擇預設的模

MVC之前事兒系列3HttpRuntime詳解分析

文章內容 話說,經過各種各樣複雜的我們不知道的內部處理,非託管程式碼正式開始呼叫ISPAIRuntime的ProcessRequest方法了(ISPAIRuntime繼承了IISPAIRuntime介面,該介面可以和COM進行互動,並且暴露了ProcessRequest介面方法)。至於為什麼要呼叫這個方法,

MVC之前事兒系列4Http Pipeline詳細分析

文章內容 繼續上一章節的內容,通過HttpApplicationFactory的GetApplicationInstance靜態方法獲取例項,然後執行該例項的BeginProcessRequest方法進行執行餘下的Http Pipeline 操作,程式碼如下: // Get application i

MVC之前事兒系列5Http Pipeline詳細分析

文章內容 接上面的章節,我們這篇要講解的是Pipeline是執行的各種事件,我們知道,在自定義的HttpModule的Init方法裡,我們可以新增自己的事件,比如如下程式碼: public class Test : IHttpModule { public void Init(HttpAp

MVC之前事兒系列2HttpRuntime詳解分析

文章內容 從上章文章都知道,asp.net是執行在HttpRuntime裡的,但是從CLR如何進入HttpRuntime的,可能大家都不太清晰。本章節就是通過深入分析.Net4的原始碼來展示其中的重要步驟。請先看下圖:   首先,CLR在初始化載入的時候,會載入一個非常重要的類AppManagerApp

MVC之前事兒系列6動態註冊HttpModule

文章內容 通過前面的章節,我們知道HttpApplication在初始化的時候會初始化所有配置檔案裡註冊的HttpModules,那麼有一個疑問,能否初始化之前動態載入HttpModule,而不是隻從Web.config裡讀取? 答案是肯定的, ASP.NET MVC3釋出的時候提供了一個Microsof

MVC之前事兒 ---- 系列文章

需要 cnblogs post omx pip 實現原理 內容 activator div MVC之前的那點事兒系列,是筆者在2012年初閱讀MVC3源碼的時候整理的,主要講述的是從HTTP請求道進入MVCHandler之前的內容,包括了原創,翻譯,轉載,整理等各類型文

RabbitMQ之Topics字元模式

說明:此模式實在路由key模式的基礎上,使用了萬用字元來管理消費者接收訊息。生產者P傳送訊息到交換機X,type=topic,交換機根據繫結佇列的routing key的值進行萬用字元匹配; 符號#:匹配一個或者多個詞lazy.# 可以匹配lazy.irs或者lazy.irs.cor符號*:只能匹配一個詞l

ActiveMQ佇列特性字元Wildcards

萬用字元(Wildcards)   一般情況下,我們使用層次結構的方式來組織佇列,比如A.B.C.D,這樣便於歸類和管理。 我們也可以使用萬用字元來配置或是操作多個佇列。 萬用字元有三個: .  用來分隔路徑 * 用來匹配路徑中的一節 > 用來匹

OD鮮為人知的小技巧--搜尋字元關鍵字

我看過一些OD教程,關於萬用字元這一點很少有人講解(大概是我看的教程少吧)    近日通過看《黑客反彙編揭祕(第二版)》第165頁瞭解到,原來OD還有這樣方便的功能,那就是搜尋萬用字元:    OllyDbg所支援的用於指定斷點的

linux檔名匹配字元使用

      當在使用命令列時,有很多時間都用來查詢你所需要的檔案,如ls find等。 S h e l l提供了一套完整的字串模式匹配規則,或者稱之為元字元,當s h e l l遇到上述字元時,就會把它們當作特殊字元,而不是檔名中的普通字元,這樣使用者就可以用它們來匹配相應的

java執行Linux命令,支援字元*

java執行linux或者windows命令,這個需求比較常見。 但是若使用  Runtime.getRuntime().exec(cmd); 會發現,若cmd中含有萬用字元,則無法執行,如cp  /dira/*.txt /dirb 可用如下方式執行: String[]

字元WildCard與正則表示式Regular Expression

1.萬用字元(wildcard)就是萬用牌的意思   * 表示匹配任意長度的任意字元   ? 表示匹配一個任意字元   […]則表示匹配括號中列出的字元中的任意一個   [!..]表示不

MySQL-字元簡單的匹配

之前的搜尋都是鑑於我們已經知道資料的情況下進行的,生活中往往有這種情況存在:我是班級的班主任,現在我想知道班級裡所有姓李的學生一共有幾個,分別叫什麼。這樣的話我們怎麼使用搜索條件?很簡單,利用萬用字元來匹配形如李X或者李XX,所有符合這種形式的都篩選出來就行了。

hadoop路徑讀取檔案的字元

一、萬用字元 萬用字元 註解 * 代表0到多個字元 ? 代表單一字元 [ ab ] 代表字元型別,匹配{a,b}中的一個字元 [ ^ab ]