Web api不同的命名操作会导致多个操作错误

时间:2016-01-20 19:06:28

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

我有web api 2控制器操作:

    [HttpGet]
    public Response<IEnumerable<Product>> Get()
    {
        ....(Get all products)
    }

    [HttpGet]
    public Response<Product> Get(int id)
    {
        ....(Get product by id)
    }

    [HttpGet]
    public Response<IEnumerable<Product>> Category(int id)
    {
        .... (Get products by category)
    }

我想将此控制器与url一起使用:

http://localhost/api/product 

http://localhost/api/product/1

http://localhost/api/product/category/1 

但是这个网址http://localhost/api/product/1会返回错误,

  

找到了与请求匹配的多项操作

我的配置设置如下:

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

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

3 个答案:

答案 0 :(得分:1)

在这里使用属性路由而不是全局路由可能会更好。如果删除全局路由并基于每个操作定义路由,则应该没有问题。例如,您的路线可能如下所示:

[Route("api/product")]
[Route("api/product/{id:int}")]
[Route("api/product/category/{id:int}")]

答案 1 :(得分:0)

您的两个Get方法匹配相同的路由。我会删除第一个Get方法,并将第二个Get方法更改为使用可选的id参数,如下所示:

[HttpGet]
public Response<IEnumerable<Product>> Get(int? id)
{
    // Get all products if id is null, else get product by id and return as a list with one element
}

这样,Get将匹配“product”和“product / 1”的路由。

答案 2 :(得分:0)

这是在Visual Studio中创建新的ASP.NET Web APi时创建的默认控制器:

[Authorize]
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)
    {
    }
}

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.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}