使用 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() { ... }
}

参考:Attribute Routing in ASP.NET Web API 2 : Route Prefixes

正如 haim770 在评论中指出的那样:问题是我有一个 物理文件夹 同名作为路由前缀。

重命名文件夹或路由前缀解决了问题。

我想另一种方法是调整 route/handler 顺序以确保属性路由优先于物理路径。