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

时间:2015-12-16 14:58:55

标签: c# asp.net-mvc model-view-controller routing attributerouting

当我使用IIS Express调试/运行并浏览到http://localhost:1234/People时,IIS Express尝试浏览People目录而不是执行People路由,然后我得到403.14 HTTP错误。所以我在Web.config中禁用了StaticFile处理程序并刷新了。现在我收到404.4 HTTP错误:

404

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

如何说服IIS / Express更喜欢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();

启动\ WebApiConfig

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

人\把PeopleController

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

请注意,由于我正在使用属性路由,因此我使用的是非标准文件夹结构。例如。我没有Controllers / Models / Views文件夹,而是每个业务区域都有根文件夹(例如~\People包含“People”业务区域的控制器/模型/等。)

我尝试过什么

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

1 个答案:

答案 0 :(得分:5)

通过添加设置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