IIS有两种模式:经典模式和集成模式。IIS7之前的版本都是经典模式,而从IIS7开始出现了集成模式,为了向后兼容也有经典模式。
经典模式是用ISAPI扩展Aspnet_isapi.dll来处理asp.net服务器页面,而集成模式把ISAPI扩展组件集成到了IIS中。从性能上讲,集成模式要优于经典模式。
下面我们通过一个例子来看看在IIS经典模式下运行ASP.NET MVC应用程序需要做哪些额外的配置。
新建一个MVC4.0程序
这里我们用IIS EXPRESS服务器调试,将模式设置为经典模式,步骤如下:
1、找到IIS EXPRESS配置文档,打开默认安装在C:\Users\当前账号名\Documents\IISExpress\config\applicationhost.config配置文件
//站点信息
<site name="MvcIISMode" id="31">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="C:\Users\v.taoerchun\Documents\Visual Studio 2013\Projects\MvcIISMo de\MvcIISMode" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:63679:localhost" />
</bindings>
</site>
//默认模式设置
<applicationDefaults applicationPool="Clr4IntegratedAppPool" />
2、删除原有站点配置,即<site></site>节点
3、将默认模式设置为经典模式: Clr4ClassicAppPool
<applicationDefaults applicationPool="Clr4ClassicAppPool " />
4、注销电脑
我也很纳闷为什么每次修改配置文件非要注销才能生效,这个问题折腾了我很久,最后非得注销才解决问题。大家也可以试试。
UrlRouting规则:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
运行程序:
可以看出,不需要做任何配置就能正常访问
现在我们更改Route规则,在action后面任意增加字符
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}.do/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
重新生成项目,运行:
程序报错,提示找不到目录。
接下来我们再次修改Routing规则,在Controller后面增加.aspx后缀
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}.aspx/{action}.do/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
重新生成,运行:
可以看出,在Controller后面增加aspx后缀就能正常访问
通过以上测试可以得出如下结论:
1、IIS经典模式下运行默认路由规则的程序时和集成模式一样不需要做任何配置就能正常访问
2、IIS经典模式下运行自定义路由规则的程序时需要在Controller后面增加.aspx后缀才能正常访问
原因:
诸如/Home.aspx/Index这种带aspx后缀才能在IIS经典模式下被Aspnet_isapi.dll接管并处理,而/Home/Index.do(至于/Home/Index这种默认路由规则也会被接管)这种形式的路径无法被Aspnet_isapi.dll截获,而是被看成静态文件访问,但实际上物理路径并不存在,所以报路径不存在的错。
本篇文章的意图是帮助那些运行在IIS经典模式下的MVC程序出错时提供解决方案,虽然经典模式不提倡用,但做为了解IIS运行原理未尝不可。