通过不同版本的 IIS 使用 ASP.NET MVC (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 Information Services (IIS) 的版本以及应用程序的请求处理模式。

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

  • IIS 7.0 (集成模式) - 无需特殊配置来使用 ASP.NET 路由。
  • IIS 7.0 (经典模式) - 需要执行特殊配置才能使用 ASP.NET 路由。
  • IIS 6.0 或更低版本 - 需要执行特殊配置才能使用 ASP.NET 路由。

最新版本的 IIS 是 Win7) 上的版本 7.5 (。 IIS 7 包含在 Windows Server 2008 AND VISTA/SP1 及更高版本中。 还可以在 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 Information Services Manager
  2. 在“连接”窗口中,选择应用程序
  3. 在“操作”窗口中,单击“ 基本设置” 链接打开“编辑应用程序”对话框, (请参阅图 1)
  4. 记下所选的应用程序池。

默认情况下,IIS 配置为支持两个应用程序池: DefaultAppPool经典 .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 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 文件配置一个名为“默认路由”的路由。

清单 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 未找到”错误。

图 2:收到“404 未找到”错误 (单击以查看全尺寸图像)

旧版 IIS 仅将某些请求映射到 ASP.NET 框架。 请求必须为具有正确文件扩展名的 URL。 例如,对 /SomePage.aspx 的请求将映射到 ASP.NET 框架。 但是,对 /SomePage.htm 的请求不会。

因此,若要使 ASP.NET 路由正常工作,必须修改默认路由,使其包含映射到 ASP.NET 框架的文件扩展名。

这是使用名为 的脚本完成的 registermvc.wsf。 它包含在 中的 ASP.NET MVC 1 版本中 C:\Program Files\Microsoft ASP.NET\ASP.NET MVC\Scripts,但自 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 () 帮助程序方法生成链接,则无需进行任何更改。

无需使用 registermvc.wcf 脚本,可以将新的扩展添加到 IIS,该扩展将手动映射到 ASP.NET 框架。 自行添加新扩展时,请确保未选中标记为 “验证文件是否存在 ”复选框。

托管服务器

你并不总是有权访问 Web 服务器。 例如,如果使用 Internet 托管提供程序托管 ASP.NET MVC 应用程序,则不一定有权访问 IIS。

在这种情况下,应使用映射到 ASP.NET 框架的现有文件扩展名之一。 映射到 ASP.NET 的文件扩展名的示例包括 .aspx、.axd 和 .ashx 扩展。

例如,清单 3 中修改的 Global.asax 文件使用 .aspx 扩展名而不是 .mvc 扩展名。

清单 3 - 使用 .aspx 扩展 (修改的 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}.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 点 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 点 0 窗口的屏幕截图,其中显示了“添加斜杠编辑应用程序扩展映射”对话框。

图 4:使用 IIS 6.0 创建通配符脚本映射 (单击以查看全尺寸图像)

启用通配符脚本映射后,需要修改 Global.asax 文件中的路由表,使其包含根路由。 否则,当你对应用程序的根页发出请求时,你将收到图 5 中的错误页。 可以使用清单 4 中修改后的 Global.asax 文件。

Microsoft Internet Explorer 窗口的屏幕截图,其中显示了“缺少根路由”错误:传入的请求与任何路由都不匹配。

图 5:缺少根路由错误 (单击以查看全尺寸图像)

清单 4 - 使用根路由) 修改的 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}/{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 应用程序的性能。