使用 ASP.NET MVC 属性路由时的默认路由
Default route when using ASP.NET MVC attribute routing
我在 Web API 中使用属性路由,如果我请求 URL /myapi/list以下控制器:
[RoutePrefix("myapi")]
public class MyController : ApiController
{
[HttpGet]
[Route("list")]
public async Task<string> Get()
{
// Return result
}
}
但是,我希望我的 Get() 方法成为 default,即在请求 URL /myapi(没有 /list 部分)。
但是如果我像这样删除 "list" 属性的 Route 部分...
[RoutePrefix("myapi")]
public class MyController : ApiController
{
[HttpGet]
[Route] // Default route
public async Task<string> Get()
{
// Return result
}
}
...我收到 403.14 错误提示
"The Web server is configured to not list the contents of this
directory."
知道是什么原因造成的吗?
谢谢!
编辑: 如果我使用 /api/myapi 这样的默认路由模式请求 API 控制器,它按预期映射到 Get() 方法。
默认路由在属性路由后注册:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
使用
[Route("")]
默认路由
[RoutePrefix("myapi")]
public class MyController : ApiController
{
//GET myapi
[HttpGet]
[Route("")] // Default route
public async Task<string> Get() { ... }
}
正如 haim770 在评论中指出的那样:问题是我有一个 物理文件夹 同名作为路由前缀。
重命名文件夹或路由前缀解决了问题。
我想另一种方法是调整 route/handler 顺序以确保属性路由优先于物理路径。
我在 Web API 中使用属性路由,如果我请求 URL /myapi/list以下控制器:
[RoutePrefix("myapi")]
public class MyController : ApiController
{
[HttpGet]
[Route("list")]
public async Task<string> Get()
{
// Return result
}
}
但是,我希望我的 Get() 方法成为 default,即在请求 URL /myapi(没有 /list 部分)。
但是如果我像这样删除 "list" 属性的 Route 部分...
[RoutePrefix("myapi")]
public class MyController : ApiController
{
[HttpGet]
[Route] // Default route
public async Task<string> Get()
{
// Return result
}
}
...我收到 403.14 错误提示
"The Web server is configured to not list the contents of this directory."
知道是什么原因造成的吗?
谢谢!
编辑: 如果我使用 /api/myapi 这样的默认路由模式请求 API 控制器,它按预期映射到 Get() 方法。
默认路由在属性路由后注册:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
使用
[Route("")]
默认路由
[RoutePrefix("myapi")]
public class MyController : ApiController
{
//GET myapi
[HttpGet]
[Route("")] // Default route
public async Task<string> Get() { ... }
}
正如 haim770 在评论中指出的那样:问题是我有一个 物理文件夹 同名作为路由前缀。
重命名文件夹或路由前缀解决了问题。
我想另一种方法是调整 route/handler 顺序以确保属性路由优先于物理路径。