我正在尝试为默认的WebApi示例添加一个特殊路由:
常规的
/api/values
(检索所有值)
/api/values/{id}
(检索特定值(按数字ID))
现在我想添加这个api:
/api/values/special
之前的API(/api/values/{id}
)应该为具有数字ID的所有请求提供服务,但/api/values/special
应该为调用该特定网址的请求提供服务。
到目前为止,我已将其用于路由:
config.Routes.MapHttpRoute("SpecialValues", "api/values/special", new { controller = "values", action = "SpecialValues" });
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
这是为了实施:
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
public string Get(int id)
{
return "value";
}
// POST api/values
public void Post([FromBody]string value)
{
}
// PUT api/values/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/values/5
public void Delete(int id)
{
}
// GET api/values/special
public IEnumerable<string> SpecialValues()
{
return new string[] { "special1", "special2" };
}
}
但它会呈现:The requested resource does not support http method 'GET'
。
如果我致电/api/values/special
并将[HttpGet]
添加到SpecialValues
方法,则可以使用
但是/api/values
将停止工作,说有多个匹配的操作。
答案 0 :(得分:2)
不需要对WebApiConfig进行更改。附加Route
属性和HttpGet
属性。您可以阅读更多相关信息here。
[HttpGet]
[Route("api/{controller}/special")]
public IEnumerable<string> SpecialValues()
{
return new string[] { "special1", "special2" };
}
WebApiConfig -
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
答案 1 :(得分:0)
是的,如上所述,基于属性的路由是唯一的方法......
这篇文章也可能让你感兴趣 Overload web api action method based on parameter type