【问题标题】:Why does not Asp.net mvc application work on Asp.Net Classic Application Pool?为什么 Asp.net mvc 应用程序不能在 Asp.Net 经典应用程序池上运行?
【发布时间】:2011-03-05 11:21:51
【问题描述】:

我在 .Net 4.0 上的 IIS 7.5 上部署了一个 Asp.Net MVC 2 Web 应用程序。当我选择应用程序池作为 Asp.Net v4.0 Classic 时,我收到以下错误。

HTTP Error 403.14 - Forbidden
The Web server is configured to not list the contents of this directory.

当我选择应用程序池作为 Asp.Net v4.0 Integrated 时,相同的应用程序工作正常。有谁知道这是什么原因?

更新:我按照以下网址中的步骤操作。

http://www.asp.net/mvc/tutorials/using-asp-net-mvc-with-different-versions-of-iis-cs

我已经为 .mvc 扩展添加了一个映射,并且还修改了路由,如下所示。

 routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // Route name
                "{controller}.mvc/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );


            routes.MapRoute(
                    "Root",
                    "",
            new { controller = "Home", action = "Index", id = "" }

现在以下 url 工作正常,我可以看到主页/索引页面。

http://myapp/home.mvc

但这仍然给出相同的错误(HTTP 错误 403.14 - 禁止)

http://myapp/

这应该可以工作,因为我已将 Root 映射到 Home/Index 操作。

更新

这是在 Win 7 Ultimate Turbo Gold Premium 64 位系统上的 IIS 7.5 上。应用程序池以集成模式运行。当我切换到经典时,一切都像宣传的那样工作。如果我在经典模式下运行我的应用程序,则会按应有的方式授予公共访问权限。那么问题来了:如果我愿意,如何在集成模式下运行它?

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-2 iis application-pool


    【解决方案1】:

    Integrated是指IIS集成管道模式:http://msdn.microsoft.com/en-us/magazine/cc135973.aspx

    当集成管道模式关闭时,对您输入的 URL 的请求不会路由到 ASP.NET。此外,由于您正在访问的文件夹中没有 default.aspx 或类似的“默认文档”,IIS 默认会尝试列出目录的内容。默认情况下,此设置在 IIS 中是禁用的,因此您会收到 403.13 Forbidden 错误。

    【讨论】:

    • 如果您需要在 IIS 6 或 IIS 7 经典模式下使用 ASP.NET MVC,请参阅本页的“将 ASP.NET MVC 与旧版本的 IIS 一起使用”部分了解详细说明。您可以选择一些设置:asp.net/mvc/tutorials/…
    【解决方案2】:

    在经典模式下,您需要进行通配符映射或在 URI 中的控制器名称上使用“.mvc”扩展名。因此,您必须将 IIS ASP.NET 配置中的 *.mvc 映射更改为 . 或将默认路由更改为:

            routes.MapRoute(
                "Default",                                              // Route name
                "{controller}.mvc/{action}/{id}",                       // URL with parameters
                new { controller = "Home", action = "Index", id = "" }, // Parameter defaults
                null
            );
    

    这些方法确实有效;事实上,这是支持 IIS 5-6 的唯一方法。另一方面,对于 IIS 7,我只使用集成模式。

    【讨论】:

    • 虽然这基本上是正确的。如果使用带有 .net 4 的经典管道,您现在不需要使用通配符,现在有更好的无扩展 URL 处理。我在发表此声明时引用了haacked.com/archive/2010/12/22/… 上的文章
    【解决方案3】:

    这是因为路由在经典模式下不起作用。网上有一些解决方法,但大多数都不是很好。

    以下是有关此主题的一些解释和帮助: http://www.asp.net/mvc/tutorials/using-asp-net-mvc-with-different-versions-of-iis-cs

    有什么理由不想使用集成的?

    【讨论】:

    • 明确一点:路由确实工作,如果它被调用的话。诀窍是让 ASP.NET完全融入其中。System.Web.Routing 本身可以正常工作。
    • 我的开发机器上有 IIS 7.5,但在 Prod 上它仍然是 IIS 6.0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 2010-12-07
    • 2013-02-21
    • 2012-09-25
    • 2014-06-03
    相关资源
    最近更新 更多