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" 业务领域)。
我试过的
- 正在设置 RAMMFAR。
- 删除并重新添加
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
当我 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" 业务领域)。
我试过的
- 正在设置 RAMMFAR。
- 删除并重新添加
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