共用方式為


使用 ASP.NET MVC 與不同版本的 IIS (C#)

演講者:Microsoft

在本教學課程中,您將了解如何將 ASP.NET MVC 和 URL 路由與不同版本的 Internet 資訊服務結合使用。 您將了解將 ASP.NET MVC 與 IIS 7.0 (經典模式)、IIS 6.0 和早期版本的 IIS 一起使用的不同策略。

ASP.NET MVC 框架依賴 ASP.NET 路由將瀏覽器請求路由到控制器操作。 為了利用 ASP.NET 路由,您可能必須在 Web 伺服器上執行其他設定步驟。 這完全取決於 Internet 資訊服務 (IIS) 的版本以及應用程式的請求處理模式。

以下是 IIS 不同版本的摘要:

  • IIS 7.0 (整合模式) - 使用 ASP.NET 路由無需特殊設定。
  • IIS 7.0 (經典模式) - 您需要執行特殊設定才能使用 ASP.NET 路由。
  • IIS 6.0 或更低版本 - 您需要執行特殊設定才能使用 ASP.NET 路由。

IIS的最新版本是 7.5 版 (在Win7上)。 IIS 7 包含在 Windows Server 2008 和 VISTA/SP1 及更高版本中。 您也可以在 Home Basic 以外的任何版本的 Vista 作業系統上安裝 IIS 7.0 (請參閱 https://technet.microsoft.com/library/cc731179%28WS.10%29.aspx 參考資料)。

IIS 7.0 支援兩種處理請求的模式。 您可以使用整合模式或經典模式。 在整合模式下使用 IIS 7.0 時,無需執行任何特殊的設定步驟。 但是,在經典模式下使用 IIS 7.0 時,您確實需要執行額外的設定。

Microsoft Windows Server 2003 包含 IIS 6.0。 使用 Windows Server 2003 作業系統時,無法將 IIS 6.0 升級到 IIS 7.0。 使用 IIS 6.0 時必須執行其他設定步驟。

Microsoft Windows XP Professional 包含 IIS 5.1。 使用 IIS 5.1 時必須執行其他設定步驟。

最後,Microsoft Windows 2000 和 Microsoft Windows 2000 Professional 包含 IIS 5.0。 使用 IIS 5.0 時必須執行其他設定步驟。

整合模式與經典模式

IIS 7.0 可以使用兩種不同的請求處理模式來處理請求:整合模式和經典模式。 整合模式提供更好的效能和更多功能。 包含經典模式是為了向後相容早期版本的 IIS。

請求處理方式由應用程式集區決定。 您可以透過確定與應用程式關聯的應用程式集區來確定特定 Web 應用程式正在使用哪種處理模式。 執行下列步驟:

  1. 啟動 Internet 資訊服務管理員
  2. 在連接視窗中,選擇一個應用程式
  3. 在操作視窗中,按一下基本設定連結以開啟編輯應用程式對話方塊 (請參閱圖 1)
  4. 記下所選的應用程式集區。

預設情況下,IIS 設定為支援兩個應用程式集區:DefaultAppPoolClassic .NET AppPool。 如果選擇 DefaultAppPool,則您的應用程式將以整合請求處理模式執行。 如果選擇經典 .NET AppPool,您的應用程式將以經典請求處理模式執行。

「編輯應用程式」對話方塊的螢幕截圖,顯示 IIS 設定為在整合請求處理模式下執行應用程式。

圖 1偵測請求處理模式 (點擊可看大圖)

請注意,您可以在「編輯應用程式」對話方塊中修改請求處理模式。 點擊選擇按鈕並更改與該應用程式關聯的應用程式集區。 請注意,將 ASP.NET 應用程式從經典模式變更為整合模式時存在相容性問題。 如需詳細資訊,請參閱下列文章:

如果 ASP.NET 應用程式使用 DefaultAppPool,則無需執行任何其他步驟即可使 ASP.NET 路由 (以及 ASP.NET MVC) 正常運作。 但是,如果 ASP.NET 應用程式設定為使用經典 .NET AppPool,然後繼續閱讀,您還有更多工作要做。

將 ASP.NET MVC 與舊版的 IIS 結合使用

如果您需要將 ASP.NET MVC 與比 IIS 7.0 更舊的 IIS 版本一起使用,或者您需要在經典模式下使用 IIS 7.0,那麼您有兩個選擇。 首先,您可以修改路由表以使用檔案副檔名。 例如,您可以請求 /Store.aspx/Details 這樣的 URL,而不是請求 /Store/Details 這樣的 URL。

第二個選項是建立稱為通配符指令碼映射的東西。 通配符指令碼對應可讓您將每個請求對應到 ASP.NET 框架中。

如果您無法存取 Web 伺服器 (例如,您的 ASP.NET MVC 應用程式由 Internet 服務提供者託管),那麼您需要使用第一個選項。 如果您不想修改 URL 的外觀,並且可以存取 Web 伺服器,則可以使用第二個選項。

我們將在以下部分中詳細探討每個選項。

在路由表中新增擴展

讓 ASP.NET 路由與舊版 IIS 一起使用的最簡單方法是修改 Global.asax 檔案中的路由表。 清單 1 中預設且未修改的 Global.asax 檔案設定了一個名為 Default 路由的路由。

清單 1 - Global.asax (未修改)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
    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
                new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            );
        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

清單 1 中設定的預設路由可讓您路由如下所示的 URL:

/Home/Index

/Product/Details/3

/Product

不幸的是,舊版的 IIS 不會將這些請求傳遞給 ASP.NET 框架。 因此,這些請求不會被路由到控制器。 例如,如果您向 URL /Home/Index 發出瀏覽器請求,那麼您將看到圖 2 中的錯誤頁面。

Microsoft Internet Explorer 視窗的螢幕截圖,其中顯示 404 Not Found 錯誤。

圖 2:收到 404 Not Found 錯誤 (點擊可看大圖)

舊版的 IIS 僅將某些請求對應到 ASP.NET 框架。 該請求必須針對具有正確檔案副檔名的 URL。 例如,對 /SomePage.aspx 的請求會對應到 ASP.NET 框架。 但是,對 /SomePage.htm 的請求則不然。

因此,為了使 ASP.NET 路由正常運作,我們必須修改預設路由,使其包含映射到 ASP.NET 框架的檔案副檔名。

這是使用名為 registermvc.wsf 的指令碼完成的。 C:\Program Files\Microsoft ASP.NET\ASP.NET MVC\Scripts 包含在 ASP.NET MVC 1 版本中,但從 ASP.NET 2 開始,該指令碼已移至 ASP.NET Futures。

執行此指令碼會向 IIS 註冊新的 .mvc 副檔名。 註冊 .mvc 副檔名後,您可以修改 Global.asax 檔案中的路由,以便路由使用 .mvc 副檔名。

清單 2 中修改後的 Global.asax 檔案適用於舊版的 IIS。

清單 2 - Global.asax (使用擴充功能進行修改)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",
                "{controller}.mvc/{action}/{id}",
                new { action = "Index", id = "" }
              );

            routes.MapRoute(
              "Root",
              "",
              new { controller = "Home", action = "Index", id = "" }
            );
        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

重要提示:請記住在更改 Global.asax 檔案後再次建立 ASP.NET MVC 應用程式。

清單 2 中的 Global.asax 檔案有兩個重要的變更。 現在 Global.asax 定義了兩條路由。 預設路由 (第一個路由) 的 URL 模式現在如下所示:

{controller}.mvc/{action}/{id}

新增 .mvc 副檔名會更改 ASP.NET 路由模組攔截的檔案類型。 透過此更改,ASP.NET MVC 應用程式現在路由如下所示的請求:

/Home.mvc/Index/

/Product.mvc/Details/3

/Product.mvc/

第二條路線,即根路線,是新的。 根路由的 URL 模式是一個空字串。 此路由對於匹配針對應用程式根目錄發出的請求是必要的。 例如,根路由將符合如下所示的請求:

http://www.YourApplication.com/

對路由表進行這些修改後,您需要確保應用程式中的所有連結都與這些新的 URL 模式相容。 換句話說,請確保所有連結都包含 .mvc 副檔名。 如果您使用 Html.ActionLink() 輔助方法來產生鏈接,那麼您不需要進行任何更改。

您可以向 IIS 添加手動映射到 ASP.NET 框架的新擴展,而不是使用 registermvc.wcf 指令碼。 自行新增擴充功能時,請確保未選取標記為驗證檔案存在的核取方塊。

託管伺服器

您並不總是能夠存取您的網頁伺服器。 例如,如果您使用 Internet 託管提供者託管 ASP.NET MVC 應用程序,則不一定有權存取 IIS。

在這種情況下,您應該使用映射到 ASP.NET 框架的現有檔案副檔名之一。 對應到 ASP.NET 的檔案副檔名範例包括 .aspx、.axd 和 .ashx 副檔名。

例如,清單 3 中修改後的 Global.asax 檔案使用 .aspx 副檔名而不是 .mvc 副檔名。

清單 3 - Global.asax (使用 .aspx 副檔名進行修改)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",
                "{controller}.aspx/{action}/{id}",
                new { action = "Index", id = "" }
              );

            routes.MapRoute(
              "Root",
              "",
              new { controller = "Home", action = "Index", id = "" }
            );
        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

清單 3 中的 Global.asax 檔案與前面的 Global.asax 檔案完全相同,只是它使用 .aspx 副檔名而不是 .mvc 副檔名。 您無需在遠端 Web 伺服器上執行任何設定即可使用 .aspx 副檔名。

建立通配符指令碼映射

如果您不想修改 ASP.NET MVC 應用程式的 URL,並且可以存取 Web 伺服器,那麼您還有一個附加選項。 您可以建立一個通配符指令碼映射,將所有對 Web 伺服器的請求對應到 ASP.NET 框架。 這樣,您就可以將預設的 ASP.NET MVC 路由表與 IIS 7.0 (經典模式) 或 IIS 6.0 結合使用。

請注意,此選項會導致 IIS 攔截針對 Web 伺服器發出的每個請求。 這包括對影像、經典 ASP 頁面和 HTML 頁面的請求。 因此,啟用通配符指令碼對應到 ASP.NET 確實會對效能產生影響。

以下是為 IIS 7.0 啟用通配符指令碼映射的方法:

  1. 在連接視窗中選擇您的應用程式
  2. 確保選擇功能檢視
  3. 雙擊處理程序映射按鈕
  4. 按一下新增通配符指令碼映射連結 (請參閱圖 3)
  5. 輸入 aspnet_isapi.dll 檔案的路徑 (您可以從 PageHandlerFactory 指令碼對應複製此路徑)
  6. 輸入名稱 MVC
  7. 點選確定按鈕

Internet Information Services Manager 7 point 0 視窗的螢幕截圖,其中顯示「新增通配符指令碼映射」對話方塊。

圖 3:使用 IIS 7.0 建立通配符指令碼映射 (按一下查看大圖)

請依照下列步驟使用 IIS 6.0 建立通配符指令碼對應:

  1. 右鍵點擊網站並選擇屬性
  2. 選擇主目錄標籤
  3. 點選設定按鈕
  4. 選擇映射索引標籤
  5. 點選插入按鈕 (圖 4)
  6. 將 aspnet_isapi.dll 的路徑貼上到「可執行檔」欄位 (您可以從 .aspx 檔案的指令碼對應複製此路徑)
  7. 取消選取標有驗證檔案存在的複選框
  8. 點選確定按鈕

Internet Information Services 6 point 0 視窗的螢幕截圖,其中顯示「新增斜線編輯應用程式擴充映射」對話方塊。

圖 4:使用 IIS 6.0 建立通配符指令碼映射 (按一下查看大圖)

啟用通配符指令碼對應後,您需要修改 Global.asax 檔案中的路由表,使其包含根路由。 否則,當您要求應用程式的根頁面時,您將看到圖 5 中的錯誤頁面。 您可以使用清單 4 中修改後的 Global.asax 檔案。

Microsoft Internet Explorer 視窗的螢幕截圖,其中顯示缺少根路由錯誤:傳入請求與任何路由都不符。

圖5:缺少根路由錯誤 (點擊看大圖)

清單 4 - Global.asax (使用 Root 路由修改)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
 
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",
                "{controller}/{action}/{id}",
                new { action = "Index", id = "" }
              );

            routes.MapRoute(
              "Root",
              "",
              new { controller = "Home", action = "Index", id = "" }
            );

        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

為 IIS 7.0 或 IIS 6.0 啟用通配符指令碼對應後,您可以發出與預設路由表一起使用的請求,如下所示:

/

/Home/Index

/Product/Details/3

/Product

摘要

本教學課程的目標是解釋在使用舊版的 IIS (或經典模式下的 IIS 7.0) 時如何使用 ASP.NET MVC。 我們討論了使 ASP.NET 路由與舊版本 IIS 一起使用的兩種方法:修改預設路由表或建立通配符指令碼對應。

第一個選項要求您修改 ASP.NET MVC 應用程式中使用的 URL。 第一個選項的一個非常顯著的優點是您無需訪問 Web 伺服器即可修改路由表。 這意味著即使在 Internet 託管公司託管 ASP.NET MVC 應用程式時,您也可以使用第一個選項。

第二個選項是建立通配符指令碼對應。 第二個選項的優點是您不需要修改 URL。 第二個選項的缺點是它會影響 ASP.NET MVC 應用程式的效能。