1

我有网页API 2控制器操作:的Web API不同的命名行为导致多个操作错误

[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) 
    } 

我想利用这个控制器,网址:

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 } 
     ); 

回答

1

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

[Route("api/product")] 
[Route("api/product/{id:int}")] 
[Route("api/product/category/{id:int}")] 
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将匹配两种“产品”和“产品/ l”的路线。

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 } 
     ); 
    } 
} 
相关问题