ASP.NET MVC5 拒绝映射与物理路径匹配的路由

ASP.NET MVC5 refuses to map a route which matches a physical path

当我 debug/run,使用 IIS Express 并浏览到 http://localhost:1234/People 时,IIS Express 尝试浏览 People 目录而不是执行 People 路由,并且我收到 403.14 HTTP 错误。因此,我禁用了 Web.config 中的 StaticFile 处理程序并进行了刷新。现在我收到 404.4 HTTP 错误:

我知道这条路线有效,因为如果我重命名 RoutePrefix,例如PeopleTest,然后路由被执行,我得到了我期望的响应。

我怎样才能说服 IIS/Express 比静态 files/directories 更喜欢 MVC 路由?

我正在使用属性路由;相关代码如下:

Web.config

<system.webServer>
    <modules>
        <remove name="FormsAuthentication" />
    </modules>

    <handlers>
        <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
        <remove name="OPTIONSVerbHandler" />
        <remove name="TRACEVerbHandler" />
        <remove name="StaticFile"/>
        <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

Global.asax

GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AutofacConfig.Configure();

Startup\WebApiConfig

namespace MyApi.Startup {
    public static class WebApiConfig {
        public static void Register(HttpConfiguration config) {
            config.MapHttpAttributeRoutes();
        }
    }
}

People\PeopleController

namespace MyApi.People {
    [RoutePrefix("People")]
    public partial class PagesController : BaseController {
        [Route]
        [HttpGet]
        [ResponseType(typeof(IEnumerable<Person>))]
        public IHttpActionResult Get() { ... }
    }
}

请注意,由于我使用的是属性路由,所以我使用的是非标准文件夹结构。例如。我没有 Controllers/Models/Views 文件夹,而是每个业务领域的根文件夹(例如 ~\People 包含 controllers/models/etc。 "People" 业务领域)。

我试过的

  1. 正在设置 RAMMFAR。
  2. 删除并重新添加 ExtensionlessUrlHandler-Integrated-4.0

已通过添加设置修复 RouteExistingFiles = true:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.RouteExistingFiles = true;
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    }
}

这样 ASP.NET 路由将处理所有路由:https://msdn.microsoft.com/en-us/library/system.web.routing.routecollection.routeexistingfiles(v=vs.110).aspx