在這篇文章中我們學習在不同版本的IIS中使用ASP.NET MVC和URL Routing。我們學習針對IIS7.0、IIS6.0和更早版本的IIS的處理策略。
ASP.NET MVC架構依賴於URL Routing,要充分利用URL Routing,我們需要對Web伺服器(IIS)進行一些額外的配置。
IIS的最新版本是Windows2008中的IIS7.0,我們也可以Vista系統中(除了Home Basic版)安裝IIS7.0。
IIS7.0是提供了兩種處理請求的模式-整合模式和傳統模式。如果使用IIS7.0的話,那我們不需要做任何配置,如果要使用傳統模式的話則需要我們做一些額外的配置工作。
在Windows2003中安裝的是IIS6.0,如果是Windows Server 2003的話,那我們可以把IIS6.0升級到IIS7.0。但如果我們使用IIS 6.0的話,那需要我們做一些額外的配置工作。
Windows XP專業版安裝的IIS5.1版本,因此我們也需要對IIS5.1進行一些額外的配置工作。
最後Windows2000使用的是IIS5.0,我們也需要對IIS5.0進行一些額外的配置工作。
下面是我們對不同版本IIS的總結:
IIS7.0(整合模式)- 不需要作任何配置就可以使用URL Routing。
IIS7.0(傳統模式) - 需要我們進行特別配置來使用URL Routing。
IIS6.0或更低版本 - 需要我們進行特別配置來使用URL Routing。
一、整合模式與傳統模式
IIS7.0可以使用兩種模式來處理請求-整合模式和傳統模式。整合模式提供更好、更多的功能;傳統模式則是為了向後相容較早版本的IIS。
請求的處理模式是由程式池決定的,我們可以通過指定程式池與應用程式關聯的方式來設定web應用程式的請求處理模式。步驟如下:
1. 運行IIS服務管理員
2. 在Connections視窗選擇一個應用程式
3. 在Actions視窗中單擊Basic Settings串連開啟Edit Application對話方塊,如下圖所示。
4. 設定Application pool。
預設情況下,IIS被配置為支援兩種應用程式集區:DefaultAppPool和Classic .NET AppPool。如果設為DefaultAppPool,那我們的應用程式就運行在整合請求處理模式下。如果設定Classic .NET AppPool,那我們的應用程式就運行在傳統的請求處理模式下。
需要注意的是,我們通過點擊Edit Application對話方塊中的”Select”按鈕來改變程式池與應用程式的關聯關係,來修改請求處理模式。但ASP.NET應用程式在從傳統模式遷移到整合模式的時候需要解決幾個相容性的問題。更多的資訊請參見下列文章:
Upgrading ASP.NET 1.1 to IIS 7.0 on Windows Vista and Windows Server 2008 --http://learn.iis.net/page.aspx/270/upgrading-aspnet-11-to-iis7-on-windows-vista--windows-server-2008/
ASP.NET Integration With IIS 7.0 - http://learn.iis.net/page.aspx/243/aspnet-integration-with-iis7/
如果我們的ASP.NET應用程式使用的是DefaultAppPool,那我們不用做任何配置就可以使用URL Routing功能了。但如果ASP.NET程式被配置為Classic .NET AppPool,那請繼續向下看。
二、在舊版本的IIS中使用ASP.NET MVC
如果我們使用的IIS版號比IIS7.0低或者使用的是IIS7.0傳統模式,那我們有兩種選擇:
1、 修改路由表,加上副檔名。如我們把/Store/Details的URL地址換為/Store.aspx/Details
2、 建立wildcard script map。wildcard script map使我們把每個請求都映射到ASP.NET架構上。
如果我不能修改伺服器的配置,那我們只好採用第一種方式,如果我們不想修改URL地址,那我們必須採用第二種方式,去配置IIS web伺服器。
在這是我們分別討論兩種在舊版本IIS中使用ASP.NET MVC的方法:
(一)向路由表中加副檔名。
要使URL Routing能夠在舊版本IIS上啟動並執行最簡單的方法就是開啟Global.asax檔案,修改我們的路由表。路由表的代碼如下:
Listing 1 – Global.asax (unmodified)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace MvcAppCS { public class GlobalApplication : System.Web.HttpApplication { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default",// Route name "{controller}/{action}/{id}",// URL with parameters