在不同版本的 IIS 上使用 ASP.NET MVC
ASP.NET MVC Framework 依赖于 URL 路由。为了利用 URL 路由,可能不得不在 Web 服务器上执行额外的配置步骤。这些步骤取决于 Internet Information Services (IIS) 的版本和应用程序的请求处理模式。
IIS 的最新版本是版本 7.0。IIS 的此版本包括在 Windows Server 2008 中。还可以在除 Home Basic 以外的任何 Vista 操作系统上安装 IIS 7.0(请参见 http://technet.microsoft.com/en-us/library/cc732624.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 版本的总结:
- IIS 7.0(集成模式)– 使用 URL 路由不需要特殊配置。
- IIS 7.0(经典模式)– 需要执行特殊配置才能使用 URL 路由。
- IIS 6.0 或更低版本– 需要执行特殊配置才能使用 URL 路由。
集成模式和经典模式
IIS 7.0 可以使用两种请求处理模式处理请求:集成模式和经典模式。集成模式可提供更好的性能和更多的功能。经典模式用于向早期的 IIS 版本提供向后兼容性。
请求处理模式由应用程序池决定。通过确定与应用程序关联的池,可以确定特定的 Web 应用程序使用何种处理模式。执行以下步骤:
- 启动 Internet Information Services Manager。
- 在 Connections 窗口中选择一个应用程序。
- 在 Actions 窗口中,单击 Basic Settings链接以打开 Edit Application 对话框,如图 1 所示。
- 注意选择的 Application Pool。
默认情况下,IIS 配置为支持两种应用程序池:DefaultAppPool和 Classic .NET AppPool。如果选择DefaultAppPool,则应用程序在集成请求处理模式下运行。如果选择Classic .NET AppPool,则应用程序在经典请求处理模式下运行。
图 1:探测请求处理模式(单击查看大图)
请注意,可以在 Edit Application 对话框中修改请求处理模式。单击 Select 按钮并更改与应用程序关联的应用程序池。需要注意的是在将 ASP.NET 应用程序从经典模式更改为集成模式时,存在兼容性问题。更多详细信息,请参阅以下文章:
- 在 Windows Vista 和 Windows Server 2008 上将 ASP.NET 1.1 升级为 IIS 7.0 -- http://learn.iis.net/page.aspx/270/upgrading-aspnet-11-to-iis7-on-windows-vista--windows-server-2008/
- ASP.NET 与 IIS 7.0 集成 - http://learn.iis.net/page.aspx/243/aspnet-integration-with-iis7/
如果 ASP.NET 应用程序使用DefaultAppPool,则不需要执行任何额外的步骤就可以让 URL 路由(即 ASP.NET MVC)正常工作。然而,如果将 ASP.NET 应用程序配置为使用 Classic .NET AppPool,则请继续阅读本教程,还有更多的工作要做。
在早期的 IIS 版本上使用 ASP.NET MVC
如果需要在早于 IIS 7.0 的 IIS 版本上使用 ASP.NET MVC,或者需要在经典模式下使用 IIS 7.0,则有两个选项可供选择。第一,修改路由表以使用文件扩展名。例如,不使用 URL /Store/Details,而是使用 URL /Store.aspx/Details。
第二个选项是创建通配符脚本映射。通配符脚本映射可以将每个请求映射到 ASP.NET Framework。
如果无权访问 Web 服务器(例如,ASP.NET MVC 应用程序由 Internet Service Provider 托管),则需要使用第一个选项。如果不想修改 URL 的内容,但有权访问 Web 服务器,则可以使用第二个选项。
我们将在下面的部分中详细讨论这两个选项。
将扩展名添加到路由表
让 URL 路由与早期的 IIS 版本协同工作的最简单的方法是修改Global.asax 文件中的路由表。程序清单 1 中的 Global.asax 文件配置了一个名称为 Default 的路由。
程序清单 1Global.asax(未修改)
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 new { controller = "Home", action = "Index", id = "" } // Parameter defaults ); } protected void Application_Start() { RegisterRoutes(RouteTable.Routes); } } }
程序清单 1 中配置的 Default 路由允许按以下方式传送 URL:
/Home/Index
/Product/Details/3
/Product
不幸的是,早期的 IIS 版本不能将这些请求传递到 ASP.NET Framework。因此,这些请求不会传送到控制器。例如,如果从浏览器发出 URL /Home/Index 请求,则将得到如图 2 所示的错误页面。
图 2:收到 404 Not Found 错误(单击查看大图)
IIS 的早期版本只将特定的请求映射到 ASP.NET Framework。请求必须是带有正确文件扩展名的 URL。例如,/SomePage.aspx 请求将映射到 ASP.NET Framework。/SomePage.htm 请求则无法映射。
因此,要让 URL 路由工作,我们必须修改 Default 路由,以使其包含能够映射到 ASP.NET Framework 的扩展名。能够映射到 ASP.NET 的文件扩展名有 .aspx, .axd, 和 .ashx 等。
程序清单 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 MvcAppCS { public class GlobalApplication : System.Web.HttpApplication { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}.aspx/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = ""} // Parameter defaults ); } protected void Application_Start() { RegisterRoutes(RouteTable.Routes); } } }
重要事项:更改 Global.asax 文件后不要忘记再次生成 ASP.NET MVC 应用程序。
程序清单 2 中只有一处对 Global.asax 文件的细小但重要的更改。现在 Default 路由的 URL 模式如下所示:
{controller}.aspx/{action}/{id}
添加 .aspx 扩展名就是更改了 URL 路由模型解析的文件类型。通过这一更改,ASP.NET MVC 应用程序现在可以传送以下请求:
/Home.aspx/Index
/Product.aspx/Details/3
/Product.aspx
如此修改路由表后,需要确保应用程序中的所有链接与新的 URL 模式兼容。换言之,需要确保所有的链接包含 .aspx 扩展名。如果使用 Html.ActionLink() Helper 方法生成链接,则应该不需要任何更改。
创建通配符脚本映射
如果不想修改用于 ASP.NET MVC 应用程序的 URL 的内容,但有权访问 Web 服务器,则可以使用另一个选项。可以创建通配符映射,将所有请求映射到 ASP.NET Framework 的 Web 服务器。通过这种方法,可以在 IIS 7.0(经典模式)或 IIS 6.0 上使用默认的 ASP.NET MVC 路由表。
请注意,此选项将导致 IIS 解析每个向 Web 服务器发出的请求。这包括对图像、经典 ASP 页面和 HTML 页面的请求。因此,启用到 ASP.NET 的通配符脚本映射确实关系到性能问题。
以下是在 IIS 7.0 上启用通配符脚本映射的方法:
- 在 Connections 窗口中选择应用程序。
- 确保选中 Features 视图。
- 双击 Handler Mappings 按钮。
- 单击 Add Wildcard Script Map 链接,如图 3 所示。
- 输入到 aspnet_isapi.dll 文件的路径(可以从 PageHandlerFactory 脚本映射复制此路径)。
- 输入名称 MVC。
- 单击 OK 按钮。
图 3:使用 IIS 7.0 创建一个通配符脚本映射(单击查看大图)
按以下步骤使用 IIS 6.0 创建通配符脚本映射:
- 右键单击网站并选择 Properties。
- 选择 Home Directory 选项卡。
- 单击 Configuration 按钮。
- 选择 Mappings 选项卡。
- 单击 Insert 按钮,如图 4 所示。
- 将 aspnet_isapi.dll 的路径粘贴到 Executable 字段(可以从 .aspx 文件的脚本映射复制此路径)。
- 取消选中 Verify that file exists复选框。
- 单击 OK 按钮。
图 4:使用 IIS 6.0 创建一个通配符脚本映射(单击查看大图)
启用用于 IIS 7.0 或 IIS 6.0 的通配符脚本映射后,可以让请求与如下所示的默认路由表协同工作:
/Home/Index
/Product/Details/3
/Product
总结
本教程的目的是解释如何在使用早期版本的 IIS(或经典模式的 IIS 7.0)的同时使用 ASP.NET MVC。我们讨论了让 URL 路由与早期版本的 IIS 协同工作的两种方法:修改默认的路由表或创建通配符脚本映射。
第一种方法要求修改 ASP.NET MVC 应用程序中使用的 URL。此方法的优势在于不需要访问 Web 服务器就可以修改路由表。这意味着由 Internet 代理公司代理 ASP.NET MVC 应用程序时可以使用此方法。
第二种方法是创建通配符脚本映射。此方法的优势在于不需要修改 URL。第二种方法的不利之处在于它可能影响 ASP.NET MVC 应用程序的性能。