HTTP错误403.14 - 禁止访问 - 使用IIS Express的MVC 4。

21

看起来似乎这是一个已经被问答过很多次的问题,但实际上不是。

开发环境: VS 2012 和 MVC 4。我正在使用内置的 IIS Express 运行应用。

这个错误直到昨天还没有出现过。突然之间它开始出现了,而且我卡住了。奇怪的是,它只在一个场景下出现。

当我尝试访问 http://localhost:49962/managescholars/ 时,它会显示这个错误。

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

但是使用http://localhost:49962/managescholars/Index是可以的,同一控制器的其他动作方法也能正常工作,例如http://localhost:49962/managescholars/create。所有其他控制器也能正常工作。

我已经尝试将以下内容添加到web.config文件中。

<system.webServer>
  <validation validateIntegratedModeConfiguration="false"/>
  <modules runAllManagedModulesForAllRequests="true" />
  <handlers/>
</system.webServer>

我也尝试以管理员身份运行以下命令

%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -ir

但是它们都没有起作用。

编辑:

我已经修改了我的路由,它们看起来如下。

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "ManageScholarLectures",
            url: "Manage/Lectures/{userFriendlyName}",
            defaults: new { controller = MVC.ManageLectures.Name , 
                            action = MVC.ManageLectures.ActionNames.Index, 
                            userFriendlyName = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "ManageScholarEdit",
            url: "Manage/Scholars/{userFriendlyName}",
            defaults: new { controller = MVC.ManageScholars.Name, 
                            action = MVC.ManageScholars.ActionNames.Edit }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = MVC.Home.Name, 
                            action = MVC.Home.ActionNames.Index, 
                            id = UrlParameter.Optional }
        );
    }

我正在使用T4MVC模板。

即使我把默认路由放在末尾并移除前两个路由,它仍然无法工作。我做错了什么?

非常感谢您的帮助。


1
你最近在路由中做了什么更改吗?那应该是我首先要查看的地方。 - George Johnston
路由应该默认将控制器的URL指向其索引页面,除非您更改了它。 - Jonesopolis
是的,你说得对。我最近修改了我的路由。我已经编辑了我的问题,并包含了RegisterRoutes方法。 - Aamir
1
我遇到了这个问题,因为我的MVC项目根目录中有一个与区域同名的文件夹。被接受的答案也解决了这个问题。 - Greg Burghardt
9个回答

67

您的路由似乎没问题。这不应该造成任何问题。错误仅出现在http://localhost:49962/managescholars/,这意味着可能存在同名的其他资源。 您能确保您的代码在执行时不会错误地创建一个managescholars文件夹吗?


3
非常感谢。这确实是问题所在。我错误地编写了一段代码,将保存文件并创建文件夹。这创建了一个名为“managescholars”的文件夹,导致了问题的出现。 - Aamir
2
完美的答案,我也遇到了“/products”路由的同样问题,而且我有一个名为“products”的物理文件夹和控制器,删除了文件夹后就解决了!非常感谢! - Nestor
1
是的!物理文件夹也是我的问题。 - Donnelle
当使用Server.MapPath(.....)时,它将使用路由路径作为文件夹(区域名称等),如果您创建一个文件夹,它将从您的网站根路径开始创建,这可能会导致路由问题... - Saw

5
我遇到了同样的问题。解决方法非常简单。
这个问题是因为在编辑项目设置中“保护URL”的属性时,发生了IIS Express冲突所致。
要解决这个问题非常容易:
1- 在“.vs\config”目录下查找名为“applicationhost.config”的文件。此文件夹位于解决方案的根目录下。您可以使用Notepad++打开它。
2- 使用程序的“查找”功能(Ctrl + F)查找您控件的名称。在我的情况下,出现问题的控件是“Offices”。
3- 删除任何节点,在该节点中放置了用于此URL的IIS设置。请参见以下示例:

    <site name="G4.Admin(1)" id="8">
                <application path="/" applicationPool="Clr4IntegratedAppPool">
                    <virtualDirectory path="/" physicalPath="C:\Projetos\PortalG4\src\G4.Admin" />
                    <virtualDirectory path="/Offices/Edit" physicalPath="C:\Projetos\PortalG4\src" />
                    <virtualDirectory path="/Offices" physicalPath="C:\Projetos\PortalG4" />
                </application>
                <application path="/Offices/Edit/2" applicationPool="Clr4IntegratedAppPool">
                    <virtualDirectory path="/" physicalPath="C:\Projetos\PortalG4\src\G4.Admin" />
                </application>
                <bindings>
                    <binding protocol="http" bindingInformation="*:6920:localhost" />
                </bindings>
            </site>

你需要删除每个元素。
<site name = "NAME_PROJECT" id = "X">

注意: 在进行更改之前请备份文件。

拥抱


正确!大多数情况下都是这样,因此您会收到禁止错误。 - Ali
这对我有用,感谢您提供的出色指导。 - mft25

1
首先,我假设

 http://localhost:49962/managescholars/

实际上是

 http://localhost:49962/manage/scholars/

如果没有,那就是你的问题 :)
我不是路由专家,但在你的Scholars路由中,userFriendlyName参数是必需的,这意味着http://localhost:49962/manage/scholars/将不匹配任何规则,IIS将把它视为列出文件夹内容的请求。

我更倾向于说 http://localhost:49962/scholars/manage 是正确的类似REST的URL。 - Youp Bernoulli

1

太好了!在我的情况下,是因为我配置应用程序在错误的 URL 上运行,但当我返回到正确的 URL 时,外观并没有覆盖 applicationhost.config。

正如我上面所说,我只能解决这些步骤。


你本可以编辑你的另一个答案并添加这个内容,而不是创建一个新答案。 - Robin Topper

1
在我的情况下,使用Visual Studio 2015,我通过以下步骤解决了问题:
  • 停止IIS Express
  • 关闭Visual Studio
  • 删除{我的解决方案目录}.vs\config中的applicationhost.config文件
  • 删除Documents\IISExpress\config目录
  • 启动VS,按F5键,享受吧 :)

0

你应该前往用户名/并在未启用时启用它。


0

如果有人遇到和我一样的问题并且绝望地进入了这个页面。

如果调试网站可以工作但是在一个网站上不工作:

检查global.asax文件是否有修改

检查路由配置是否仍然存在...

我知道这很蠢,但在一个git合并后浪费了6个小时...


0

我知道原问题已经得到解答,但以下方法在我的情况下有效。 我在使用IIS Express的VS2013中遇到了完全相同的问题。在我的情况下,访问/Login时没有获取到LoginController中的Index操作。当我检查时,发现没有物理文件夹,但是经过更深入的挖掘,我发现在IIS Express上创建了一个/Login路径的虚拟目录,导致了这个问题。我从应用程序主机配置(Documents\IISExpress\config)中删除了虚拟目录以解决问题。


0
在我的情况下,使用了@Fl4v的答案后,在{我的解决方案目录}.vs\config中的文件applicationhost.config上搜索了< strong > directoryBrowse < / strong >属性,并发现它是false。将其更改为true,重新启动iis,现在终于可以工作了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接