在不同版本的 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
IIS5.1 也就是XP下的IIS,部署MVC
第一个要注意到地方是,ASP.NET MVC 默认情况下是没有把 System.Web.Abstractions.dll,System.Web.Routing.dll,System.Web.Mvc.dll 这三个程序集私有部署的,如果服务器上没有安装ASP.NET 3.5 SP1的话,请把这三个程序集采用私有部署,也就是跟网站程序一起部署在bin目录下。
第二个地方是,IIS5.1不能设置通配符,也不能像IIS7一样配置Handler,但是可以通过配置Routing 来实现把请求交给ASP.NET 的 ISAPI Filter来处理,比如在Global.asax.cs里可以这样配置:
routes.MapRoute(
"Default",
"{controller}.aspx/{action}/{id}",
new { controller = "Home", action = "Index", id = ""}
);
总结
本教程的目的是解释如何在使用早期版本的 IIS(或经典模式的 IIS 7.0)的同时使用 ASP.NET MVC。我们讨论了让 URL 路由与早期版本的 IIS 协同工作的两种方法:修改默认的路由表或创建通配符脚本映射。
第一种方法要求修改 ASP.NET MVC 应用程序中使用的 URL。此方法的优势在于不需要访问 Web 服务器就可以修改路由表。这意味着由 Internet 代理公司代理 ASP.NET MVC 应用程序时可以使用此方法。
第二种方法是创建通配符脚本映射。此方法的优势在于不需要修改 URL。第二种方法的不利之处在于它可能影响 ASP.NET MVC 应用程序的性能
在不同版本的 IIS 上使用 ASP.NET MVC的更多相关文章
- 不同版本的 IIS 中使用 ASP.NET MVC(C#)【转】
由微软 ASP.NET 团队|2008 年 8 月 19 日 推特 在本教程中,您将学习在不同版本的 Internet Information Services 中如何使用 ASP.NET MVC 和 ...
- IIS中使用ASP.NET MVC的经验总结
在这篇文章中我们学习在不同版本的IIS中使用ASP.NET MVC和URL Routing.我们学习针对IIS7.0.IIS6.0和更早版本的IIS的处理策略. ASP.NET MVC框架依赖于URL ...
- ASP.NET Core 2.2 和之前版本区别: 可以在IIS上进行ASP.NET核心进程托管 (翻译)
原文链接: https://weblog.west-wind.com/posts/2019/Mar/16/ASPNET-Core-Hosting-on-IIS-with-ASPNET-Core-22 ...
- .NET开发框架(五)-IIS上部署ASP.NET Core项目教程
系列教程:从初学者到架构师的一步步蜕变 本篇经验将和大家介绍如何在IIS上部署ASP.NET Core项目,希望对初学.NET CORE的童靴入门有所帮助! 1.打开VS,创建项目,选择ASP.NET ...
- Visual Studio 调试系列12 远程调试部署在远程计算机IIS上的ASP.NET应用程序
系列目录 [已更新最新开发文章,点击查看详细] 要调试已部署到IIS的ASP.NET应用程序,请在部署应用程序的计算机上安装并运行远程工具,然后从Visual Studio附加到正在运行的应用 ...
- Web Server 在IIS上部署ASP.NET Core项目
在IIS上部署ASP.NET Core项目 一.配置应用程序池为无托管: 二.安装ASPNETCoreModule:(核心) 下载地址:https://go.microsoft.com/fwlink/ ...
- Mono 4.0 Mac上运行asp.net mvc 5.2.3
Mono 4.0 已经发布,二进制包已经准备好,具体的发布说明参见:http://www.mono-project.com/docs/about-mono/releases/4.0.0/. 今天在Ma ...
- 在Windows Azure上创建ASP.NET MVC网站
本篇体验在Windows Azure上创建ASP.NET MVC网站. →登录到Windows Azure管理门户 →点击左下方的"新建" →点击"自定义创建" ...
- 在IIs上部署asp.net core2.1项目
转自:https://www.cnblogs.com/jasonduan/p/9193702.html 在IIS上部署你的ASP.NET Core 2.1项目 1.在控制面板→程序→启用或关闭Wi ...
随机推荐
- java properties 文件中书写相对路径
工程src下的properties 文件要引用发布到D:\work\apache-tomcat-7.0.52\webapps\项目名称\certs这个地址下的文件,properties 中的文件路径应 ...
- C++学习笔记(五):指针和引用
声明指针: //指针声明 * 号左右的空格是可选的,下面的定义都是正确的 int *pointer1; int* pointer2; int*pointer3; int * pointer4; //注 ...
- 【WPF】 打开本地的文件或者文件夹
问题描述: 我做的程序中需要添加帮助文档,我将文档生成了CHM格式,在用户点击帮助按钮时候 弹出帮助文档. 实现方法: System.Diagnostics.Process.Start(AppDoma ...
- 【09】绝不在构造和析构过程中调用virtual方法
1.绝不在构造和析构过程中调用virtual方法,为啥? 原因很简单,对于前者,这种情况下,子类专有成分还没有构造,对于后者,子类专有成分已经销毁,因此调用的并不是子类重写的方法,这不是程序员所期望的 ...
- centos 改动字符集为GB2312的方法
这几天总是被一个问题困扰着,那就是base64的加密,在centos server上无法解密.经过重复測试才发现,原来是由于centos 系统没有GB2312库导致的. 加密端是在ASP.NET中处理 ...
- 实现android activity之间的跳转
android程序一般不会只有一个activity,会碰到activity之间的跳转.以下是使用Intent做应用程序内部的activity做跳转.比如,应用程序第一个activity是: 点击“下一 ...
- 如何编写程序设置Android来电铃声
我们在拿到新手机后通常会为其设置来年铃声,那么怎样通过代码来设置Android来电铃声,本文就为大家实例讲解下. 1.如果读到的是音频文件路径,需要先将音乐文件插入到多媒体库. Java代码 //设置 ...
- SQL书写技巧
SQL书写技巧: 1.针对分区表,如果可以使用分区条件的,一定要加分区条件.分区条件的使用,可以减少不必要的数据访问,加快查询数据,如TB_CSV_ACCEPT_FLOW_OPERATOR表,以acc ...
- DataGridView实现倒计时功能(源码)
需求:最近做一个即时通项目,需要结合OA项目:其中有一个待办事项需要倒计时,准备在DataGridView里展示,如图: 第一步:绑定数据 ; intLoop <= ; intLoop++) { ...
- Internationalization
Internationalization If you are building a site for an international audience, you will likely want ...