使用ASP.NET MVC属性路由时的默认路由

时间:2016-06-22 12:16:23

标签: asp.net asp.net-mvc asp.net-web-api asp.net-web-api2 attributerouting

我正在使用Web API进行属性路由,如果我使用以下控制器请求URL / myapi / list ,一切都按预期工作:

[RoutePrefix("myapi")]
public class MyController : ApiController
{
    [HttpGet]
    [Route("list")]
    public async Task<string> Get()
    {
       // Return result
    }
}

但是,我希望 Get()方法为默认,即在请求网址 / myapi 时(不包含< strong> / list part)。

但是,如果我删除“路径属性的”列表“部分,就像这样...

[RoutePrefix("myapi")]
public class MyController : ApiController
{
    [HttpGet]
    [Route] // Default route
    public async Task<string> Get()
    {
       // Return result
    }
}

...我收到 403.14 错误

  

“Web服务器配置为不列出此内容   目录“。

可能导致这种情况的任何想法?

谢谢!

修改:如果我使用默认路由模式(如 / 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 }
        );
    }

2 个答案:

答案 0 :(得分:2)

使用

[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

答案 1 :(得分:1)

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

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

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