不同版本的 IIS 中使用 ASP.NET MVC(C#)【转】

微软 ASP.NET 团队|2008 年 8 月 19 日

在本教程中,您将学习在不同版本的 Internet Information Services 中如何使用 ASP.NET MVC 和 URL 路由。您将了解与 IIS 7.0 (经典模式)、 IIS 6.0 和早期版本的 IIS 使用 ASP.NET MVC 的不同策略。

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 IIS 7 是包括与 Windows 服务器 2008年和 VISTA/SP1 和更高。您还可以在任何版本的 Vista 操作系统除了首页基本安装 IIS 7.0 (见http://technet.microsoft.com/en-us/library/cc731179%28WS.10%29.aspx).

IIS 7.0 支持两种模式用于处理请求。您可以使用集成的模式或经典模式。您不需要执行任何特殊的配置步骤,使用 IIS 7.0 在集成模式下时。然而,你需要执行额外的配置,在经典模式中使用 IIS 7.0 时。

微软 Windows Server 2003 包括 IIS 6.0。使用 Windows Server 2003 操作系统时,不能将 IIS 6.0 升级到 IIS 7.0。使用 IIS 6.0 时,您必须执行额外的配置步骤。

微软 Windows XP 专业版包括 IIS 5.1。使用 IIS 5.1 时,您必须执行额外的配置步骤。

最后,微软 Windows 2000 和 Microsoft Windows 2000 专业版包括 IIS 5.0。使用 IIS 5.0 时,您必须执行额外的配置步骤。

集成与经典模式

IIS 7.0 可以处理请求使用两种不同的请求处理模式: 集成和经典。集成模式下提供了更好的性能和更多的功能。经典模式,倒会包含与早期版本的 IIS 的兼容性。

请求处理模式取决于应用程序池。您可以确定哪些处理模式通过确定与应用程序关联的应用程序池使用由一个特定的 web 应用程序。请按照下列步骤操作:

  1. 推出的互联网信息服务管理器
  2. 在连接窗口中,选择应用程序
  3. 在操作窗口中,单击基本设置链接,打开编辑应用程序对话框 (见图 1)
  4. 注意到所选的应用程序池。

默认情况下,IIS 已配置为支持两个应用程序池:DefaultAppPoolClassic .NET AppPool如果选择了默认应用程序池,然后您的应用程序正在运行集成的请求处理模式。如果选择了经典.NET 池,则您的应用程序经典的请求处理模式下运行。

不同版本的 IIS 中使用 ASP.NET MVC(C#)【转】

图 1: 检测点击查看完全尺寸的图像的请求处理模式

请注意您可以修改在编辑应用程序对话框内的请求处理模式。单击选择按钮并更改与该应用程序关联的应用程序池。意识到是从经典到集成模式更改 ASP.NET 应用程序时,兼容性问题。有关详细信息,请参阅以下文章:

如果 ASP.NET 应用程序使用的默认应用程序池,您不需要执行任何额外的步骤来获取 ASP.NET 路由 (和因此 ASP.NET MVC) 工作。然而,如果 ASP.NET 应用程序配置为使用经典.NET 池,然后继续读下去,你会有更多的工作要做。

与旧版本的 IIS 使用 ASP.NET MVC

如果您需要使用 ASP.NET MVC 与早期版本的 IIS 比 IIS 7.0,或您需要使用经典模式下的 IIS 7.0,然后你就有两个选项。第一,您可以修改要使用的文件扩展名的路由表。例如,而不是要求像 /Store/Details 的 URL,你会请求像 /Store.aspx/Details 的 URL。

第二个选项是创建叫做通配符脚本映射通配符脚本映射使您能够将每个请求映射到 ASP.NET 框架。

如果您没有权限访问到您的 web 服务器 (例如,应用程序由互联网服务提供商正在主办您 ASP.NET MVC) 你会需要使用第一种选择。如果你不想修改您的 Url 的外观,并且您可以访问您的 web 服务器,然后您可以使用第二个选项。

我们探讨在以下各节中详细的每个选项。

向路由表添加扩展名

获取 ASP.NET 路由工作与较早版本的 IIS 的最简单方法是修改您在 Global.asax 文件中的路由表。默认情况下,并在清单 1 中的未修改的 Global.asax 文件配置一条路线命名的默认路由。

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

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;usingSystem.Web.Routing;namespaceMvcApplication1{publicclassGlobalApplication:System.Web.HttpApplication{publicstaticvoidRegisterRoutes(RouteCollection routes){
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute("Default",// Route name"{controller}/{action}/{id}",// URL with parametersnew{ controller ="Home", action ="Index", id =""}// Parameter defaults);}protectedvoidApplication_Start(){RegisterRoutes(RouteTable.Routes);}}}

配置清单 1 中的默认路由允许您对路由 Url,看起来像这样:

/ 首页/索引

/ 产品/详细信息/3

/ 产品

不幸的是,旧版本的 IIS 不会将这些请求传递给 ASP.NET 框架。因此,不会让这些请求路由到一个控制器。例如,如果你让浏览器请求的 URL /Home 索引然后就会在图 2 中得到的错误页。

不同版本的 IIS 中使用 ASP.NET MVC(C#)【转】

图 2: 收到 404 未找到错误(点击查看完全尺寸的图像)

较早版本的 IIS 只将某些请求映射到 ASP.NET 框架。请求必须具有正确的文件扩展名的 URL。例如,/SomePage.aspx 的请求获取映射到 ASP.NET 框架。但是,/SomePage.htm 的请求并不。

因此,要获取 ASP.NET 路由工作,我们必须修改的默认路由,它包括文件扩展名映射到 ASP.NET 框架。

这是使用脚本命名为registermvc.wsf它是包含在 ASP.NET MVC 1 发布在C:Program FilesMicrosoft ASP.NETASP.NET MVCScripts,但到 ASP.NET 2 此脚本已被移动到 ASP.NET 期货,可在http://aspnet.codeplex.com/releases/view/39978.

执行此脚本将 IIS 注册新的.mvc 扩展名。你注册.mvc 扩展后,你可以修改您的航线 Global.asax 文件中,以便路线使用.mvc 扩展名。

清单 2 中修改的 Global.asax 文件工作与较早版本的 IIS。

清单 2-Global.asax (具有扩展名修改)

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;usingSystem.Web.Routing;namespaceMvcApplication1{publicclassMvcApplication:System.Web.HttpApplication{publicstaticvoidRegisterRoutes(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 =""});}protectedvoidApplication_Start(){RegisterRoutes(RouteTable.Routes);}}}

重要提示: 记住要更改 Global.asax 文件后再生成您的 ASP.NET MVC 应用程序。

有到 Global.asax 文件清单 2 中的两个重要变化。现在有两条路线在 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 服务器。例如,如果承载您 ASP.NET MVC 应用程序中使用互联网托管提供程序,然后你就不一定有访问 IIS。

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

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

清单 3-Global.asax (.aspx 扩展名修改)

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;usingSystem.Web.Routing;namespaceMvcApplication1{publicclassMvcApplication:System.Web.HttpApplication{publicstaticvoidRegisterRoutes(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 =""});}protectedvoidApplication_Start(){RegisterRoutes(RouteTable.Routes);}}}

Global.asax 文件清单 3 中的确切地是它而不是.mvc 扩展使用.aspx 扩展名的事实以前的 Global.asax 文件相同。你不需要执行任何安装程序在您要使用.aspx 扩展名的远程 web 服务器上。

创建的通配符脚本映射

如果你不想要修改您的 ASP.NET MVC 应用程序的 Url,并且您可以访问您的 web 服务器,然后你就有一个额外的选择。您可以创建将所有请求都映射到 ASP.NET 框架对 web 服务器的通配符脚本映射。这种方式,你可以使用默认的 ASP.NET MVC 路由表 (在经典模式下) IIS 7.0 或 IIS 6.0。

请注意此选项会导致 IIS 以截获对 web 服务器所作的每个请求。这包括图像、 经典的 ASP 页和 HTML 页面的请求。因此,启用通配符脚本映射到 ASP.NET 不会有性能的影响。

这里是如何为 IIS 7.0 启用通配符脚本映射:

  1. 在连接窗口中选择您的应用程序
  2. 请确保在功能视图选择
  3. 双击处理程序映射按钮
  4. 单击添加通配符脚本映射链接 (见图 3)
  5. (您可以从 PageHandlerFactory 的脚本映射复制此路径) 的 aspnet_isapi.dll 文件输入的路径
  6. 输入的名称 MVC
  7. 单击确定按钮

不同版本的 IIS 中使用 ASP.NET MVC(C#)【转】

图 3: 使用 IIS 7.0单击查看完全尺寸的图像创建的通配符脚本映射

请按照这些步骤使用 IIS 6.0 创建的通配符脚本映射:

  1. 右键单击网站,然后选择属性
  2. 选择主目录选项卡
  3. 单击配置按钮
  4. 选择映射选项卡
  5. 单击插入按钮 (见图 4)
  6. Aspnet_isapi.dll 的路径粘贴到可执行文件的字段,(你可以从.aspx 文件的脚本映射复制此路径)
  7. 取消选中的复选框,标记为确认文件存在
  8. 单击确定按钮

不同版本的 IIS 中使用 ASP.NET MVC(C#)【转】

图 4: 使用 IIS 6.0点击查看完全尺寸的图像创建的通配符脚本映射

您启用通配符脚本映射后,您需要修改 Global.asax 文件中的路由表,使它包括一条根的路线。否则,就会在图 5 中获取的错误页面,当您为您的应用程序的根页的请求时。您可以使用清单 4 中修改的 Global.asax 文件。

不同版本的 IIS 中使用 ASP.NET MVC(C#)【转】

图 5: 缺少根路线错误(点击查看完全尺寸的图像)

清单 4-Global.asax (与根路线修改)

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;usingSystem.Web.Routing;namespaceMvcApplication1{publicclassMvcApplication:System.Web.HttpApplication{publicstaticvoidRegisterRoutes(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 =""});}protectedvoidApplication_Start(){RegisterRoutes(RouteTable.Routes);}}}

您启用通配符脚本映射,IIS 7.0 或 IIS 6.0 之后,您可以使用默认的路由表看起来像这样的请求:

/

/ 首页/索引

/ 产品/详细信息/3

/ 产品

摘要

本教程的目标是解释如何时,可以使用 ASP.NET MVC 中使用较早版本的 IIS (或在经典模式下的 IIS 7.0)。我们讨论了获取 ASP.NET 路由工作与较早版本的 IIS 的两个方法: 修改默认的路由表或创建的通配符脚本映射。

第一个选项要求您修改您的 ASP.NET MVC 应用程序中使用的 Url。此首选项的一个非常显著的优势是不需要访问 web 服务器的权限才能修改路由表。这意味着您可以使用此首选项,与互联网承载您的 ASP.NET MVC 应用程序时,即使托管公司。

第二个选项是创建一个通配符脚本映射。此第二个选项的好处是你不需要修改您的 Url。这第二个选项的缺点是它可以影响 ASP.NET MVC 应用程序的性能。

// 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
    // 请访问 http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 URL
                new { controller = "Home", action = "Main", id = UrlParameter.Optional } // 参数默认值
            );
        }

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);

            string configPath = ConfigurationManager.AppSettings["SOAInterfaceConfig"];
            TongCheng.SOA.Core.Config.SOAConfigurator.Configurate(new System.IO.FileInfo(Server.MapPath(configPath)));

            #region 自动运行程序自启动心跳
            AutoRunMonitorHelper arMonitor = new AutoRunMonitorHelper();
            arMonitor.StartMonitor();
            #endregion
          
        }

        protected void Application_Error()
        {
            Exception ex = Server.GetLastError();          
        }