2016-03-08 75 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

謝謝,解決了它。 –