2015-07-13 18 views
0

爲什麼每個Web API操作都需要用例如默認啓用Web API的所有http動詞?

[AcceptVerbs("Get", "Post")] 

要具體接受Get和Post?是否有一種方法可以全局允許所有動詞進行所有動作,而不依賴方法名稱的Get或Post Prefeix?

儘管還有其他的做事方式,爲了將動詞綁定到動作上,爲什麼不允許所有的動作都在需要時限制它們呢?

回答

2

默認情況下未啓用該功能的原因是它會破壞您的RESTful api。

如果您默認啓用了所有動詞,那麼將無法確定要使用哪個動作。

讓我們舉個例子,你有一個包含4種方法UsersControllerGet all usersGet specific userPost userDelete user。這些方法只會導致兩個不同的端點,並且WebApi引擎能夠選擇正確的方法,它需要HTTP動詞。

UsersController

[RoutePrefix("api/users")] 
public class UsersApiController : ApiController 
{ 
     [Route("")] 
     public IHttpActionResult Get() 
     { 
      var result = _userRepository.GetAll(); 

      return Ok(result); 
     } 

     [Route("{id:guid}")] 
     public IHttpActionResult Get(Guid id) 
     { 
      var result = _userRepository.GetById(id); 

      if (result == null) 
       return NotFound(); 

      return Ok(result); 
     }   

     [Route("")] 
     public IHttpActionResult Post([FromBody]UserPostModel model) 
     { 
      var user = new User(model.FirstName, model.LastName); 
      _userRepository.Add(user);   

      return Created<User>(Request.RequestUri + user.Id.ToString(), user); 
     } 

     [Route("{id:guid}")] 
     public IHttpActionResult Delete(Guid id) 
     { 
      var result = _userRepository.Delete(id); 

      if (!result) 
       return BadRequest(); 

      return Ok(); 
     }   

     public class UserPostModel 
     { 
      public string FirstName { get; set; } 
      public string LastName { get; set; } 
     } 

     public class User 
     { 
      public User(string firstName, string LastName) 
      { 
       Id = Guid.NewGuid(); 
       FirstName = firstName; 
       LastName = lastName; 
      } 

      public Guid Id { get; private set; } 
      public string FirstName { get; private set; } 
      public string LastName { get; private set; }   
     } 
}