2015-07-13 14 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; }   
     } 
}