在不同版本的 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 ...
随机推荐
- Ecshop图片不清晰怎么办?
很多人说缩略图的质量不高,模糊,那是因为gd库生成缩略图时,默认生成jpg缩略图或商品图的质量是75.可以通过修改生成缩略图质量的默认值来提高缩略图的质量. 找到includes/cls_image. ...
- ZZTHX-线程锁
以前一直在做卡乐付,悲剧的是项目中的余额查询,超级转账和刷卡器相关的东西已经开发好了,我对这块还是比较好奇和感兴趣的,在项目空闲的时候我就开始尝试熟悉和了解这块的业务和代码.实践出真理,只有在实践中才 ...
- Spring + iBatis 的多库横向切分简易解决思路
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- 关于python文件操作 (转载)
总是记不住API.昨晚写的时候用到了这些,但是没记住,于是就索性整理一下吧: python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Pyth ...
- js过滤前后空格
页面中添加代码 String.prototype.trim=function() { return this.replace(/(^\s*)|(\s*$)/g,'');} 调用:title.tr ...
- Funambol Developer's Guide 中 connector development样例的问题
今天学习Funambol的connector开发,官方文档中的样例有问题. 首先,文档中提供的maven命令不可用: mvn archetype:generate -DarchetypeGroupId ...
- 百度之星资格赛,hdu 4825 XOR SUM
显然是要建一棵0.1树 事实上非常easy就是二叉树,仅仅只是为了操作简便,即程序的速度,所以就採用静态树,即不动态分配内存,使用较大的全局数组.0是根节点 #include<cstdio> ...
- webService 讲解
Web Service简介: Web Service 是构建互联网分布式系统的基本部件,可以将具有特定功能或者可复用应用程序封装. 技术组成要素: SOAP:Web Service的基本通信协议,由普 ...
- global 用法
<?php//$GLOBALS['he']="hechunhuae";function Test(){ //global $he; $GLOBALS['he']=" ...
- eclipse安装插件的方法,以python为例子
一 转载自:http://www.cnblogs.com/linzhenjie/articles/2639113.html 1.基本需求 1.Eclipse 集成开发环境下载 http://115.c ...