使用WebApi重叠路由

时间:2014-03-02 00:12:02

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

我正在尝试为默认的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将停止工作,说有多个匹配的操作。

2 个答案:

答案 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