Я готовлю доклад для местного Code Camp и пытаюсь понять нюансы HTTP Verbs в ApiController. Несколько вещей в ApiController значительно изменились между бета-версией, RC и финальной версией, и советы о том, как вы можете настроить это, противоречивы, а иногда и неверны.
Предполагая, что я просто оставляю стандартную маршрутизацию в WebApiConfig:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
(поскольку вы действительно можете положить вещи с ног на голову, если добавите здесь параметр {action})
Я понимаю, как соглашение работает для простых вызовов Crud, таких как:
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
public string Get(int id)
{
return "value";
}
// POST api/values
public void Post([FromBody]string value)
{
}
Или что вы можете изменить их, если они начинаются с имени глагола:
// GET api/values/5
public string GetMyStuff(int id)
{
return "value";
}
Однако в исходной спецификации сказано, что ApiController поддерживает Get, Put, Post и Delete. Тем не менее, я могу добавить методы для:
public void HeadOfTheClass()
{
}
Это работает для глагола Head, но я не могу добавить методы для неясных или несуществующих глаголов:
public void MKCOL()
{
}
public void Bubba()
{
}
Каков полный список «поддерживаемых» глаголов в родном языке?
Однако я могу добавить поддержку этих методов, используя атрибут AcceptVerb:
[AcceptVerbs("MKCOL")]
public void MKCOL()
{
}
[AcceptVerbs("Bubba")]
public void Bubba()
{
}
Это также работает, или для любого «определенного» глагола используйте атрибуты Http:
[HttpHead]
public void HeadOfTheClass()
{
}
[HttpGet]
public void Bubba()
{
}
Что правильно или предпочтительно? (Также были такие атрибуты, как [GET] и [POST], они устарели?)
Эквивалентны ли [HttpBindNever] и [NonAction]?