我有一个控制器列表
[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
引用该项目答案 0 :(得分:0)
不要给param一个默认值,而是尝试使你的id param为空:
public IEnumerable<string> List(int? id)
然后在代码中检查null。这也有助于区分传递的零与省略的参数值。
答案 1 :(得分:0)
我无法弄清楚如何准确解决问题,但我确实找到了解决问题的方法。
首先,我正确地确定当我的路由在单个程序集中时,完全相同的代码工作正常。当我的项目在不同的程序集中路由时,config.MapHttpAttributeRoutes();
很难正确识别属性路由。
另一方面,使用RoutePrefix
似乎解决了我的问题。
我不打算将此作为我的答案,因为我觉得它并没有真正解决问题,但我觉得这对任何提出这个问题的人来说都是有用的。