IIS经典模式对ASP.NET MVC应用程序的影响

本文详细介绍了如何在IIS经典模式下配置MVC4.0程序,并针对路由规则进行了深入探讨。通过实例演示了在不同路由规则下程序的运行情况,特别强调了Controller后缀的aspx对于经典模式的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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运行原理未尝不可。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值