除非使用参数,否则WebApi 2 Route属性不起作用

时间:2015-07-06 17:50:54

标签: c# asp.net-mvc asp.net-web-api routing

我有一个控制器列表

[Route("api/cache/list")]
[HttpGet]
public IEnumerable<string> List()
{
   ...
}

但如果我尝试转到localhost:12121 / api / cache / list,我会收到404。我的webapi配置如下所示:

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // Configure Web API to use only bearer token authentication.
            //config.SuppressDefaultHostAuthentication();
            //config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // Web API routes
            config.MapHttpAttributeRoutes();
            config.Formatters.Remove(config.Formatters.XmlFormatter);

            //config.Routes.MapHttpRoute(
            //    name: "DefaultApi",
            //    routeTemplate: "api/{controller}/{id}",
            //    defaults: new { id = RouteParameter.Optional }
            //);
        }
    }

另一方面,如果我将控制器更改为

[Route("api/cache/list/{id}")]
[HttpGet]
public IEnumerable<string> List(int id =0)
{
   ...
}

它会起作用。我试过没有id作为参数,仍然做最好的工作。我在这里做错了什么?

额外信息:

我确实有一个奇怪的设置。我的WebApiConfig.cs和global.cs在一个不同的项目中。然后,具有我的控制器的项目将使用WebApiConfig.cs

引用该项目

2 个答案:

答案 0 :(得分:0)

不要给param一个默认值,而是尝试使你的id param为空:

public IEnumerable<string> List(int? id)

然后在代码中检查null。这也有助于区分传递的零与省略的参数值。

答案 1 :(得分:0)

我无法弄清楚如何准确解决问题,但我确实找到了解决问题的方法。

首先,我正确地确定当我的路由在单个程序集中时,完全相同的代码工作正常。当我的项目在不同的程序集中路由时,config.MapHttpAttributeRoutes();很难正确识别属性路由。

另一方面,使用RoutePrefix似乎解决了我的问题。

我不打算将此作为我的答案,因为我觉得它并没有真正解决问题,但我觉得这对任何提出这个问题的人来说都是有用的。