2016-03-08 76 views
1

我偶然发现了这个问题。我有这条路线Web API上的POST/PUT路由限制问题2

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

和我有这样

public class CarsController : ApiController 
{ 
    public IEnumerable<Car> Get() { ... } 
    public HttpResponseMessage Get(int id) { ... } 
    public HttpResponseMessage Post(Car car) { ... } 
    public HttpResponseMessage Put(int id, Car car) { ... } 
    public HttpResponseMessage Delete(int id) { ... } 
} 

控制器基本上发生的事情是,我的路由被允许进行POST请求,像一个端点,这个/API /汽车/ ID,当它不应该,因为创建一个新的汽车的要求应该是这个端点/API /汽车

我已经找到答案了我的问题this link,但我想知道Web API的较新版本是否已经内置了一些内容以防止出现这种情况,如果是,那么如何使用它?

谢谢

回答

1

如果你使用属性路由,你完全避免了这个问题。相反,与config.Routes.MapHttpRoute定义你的路由的使用config.MapHttpAttributeRoutes(),然后把你的控制器方法属性:

public class CarsController : ApiController 
{ 
    [HttpGet] 
    [Route("api/cars")] 
    public IEnumerable<Car> Get() { ... } 

    [HttpGet] 
    [Route("api/cars/{id}")] 
    public HttpResponseMessage Get(int id) { ... } 

    [HttpPost] 
    [Route("api/cars")] 
    public HttpResponseMessage Post(Car car) { ... } 

    [HttpPut] 
    [Route("api/cars/{id}")] 
    public HttpResponseMessage Put(int id, Car car) { ... } 

    [HttpDelete] 
    [Route("api/cars/{id}")] 
    public HttpResponseMessage Delete(int id) { ... } 
} 

您也可以在控制器级别添加RoutePrefix属性,以避免每个控制器上复制一些资料的途径。您也可以避免放置Http动词属性,如果您以方法名称命名方法名称,而方法名称是动词,但我更愿意使用每个方法的属性来保持一致性。

This是一篇很好的文章,讨论属性路由与约定路由。它专门讨论MVC,但它也适用于web api。

希望有所帮助。

+0

谢谢,解决了它。 –