默认情况下为Web API启用所有http谓词?

时间:2015-07-13 05:59:23

标签: asp.net-mvc asp.net-web-api

为什么每个Web API操作都需要用例如

进行修饰
[AcceptVerbs("Get", "Post")]

专门接受Get和Post?有没有办法全局允许所有动作的所有动词而不依赖于方法名称的Get或Post Prefeix?

除了剩下的处理方式之外,为了将动词绑定到Actions,为什么不允许所有人在需要时限制它们?

1 个答案:

答案 0 :(得分:2)

默认情况下不启用它的原因是它会破坏您的RESTful API。

如果您默认启用了所有谓词,则无法确定要使用的操作。

我们举个例子,你有UsersController,其中包含4种方法:Get 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; }        
        }
}