В результате моего предыдущего вопроса я обнаружил два способа обработки REST-маршрутов в MVC3.
Это дополнительный вопрос, в котором я пытаюсь понять фактические различия / тонкости между этими двумя подходами. Я ищу авторитетный ответ, если это возможно.
Метод 1: одиночный маршрут, с именем действия + атрибуты глагола Http для действий контроллера
Зарегистрировать отдельный маршрут в Global.asax
, используя указанный параметр action
.
public override void RegisterArea(AreaRegistrationContext context)
{
// actions should handle: GET, POST, PUT, DELETE
context.MapRoute("Api-SinglePost", "api/posts/{id}",
new { controller = "Posts", action = "SinglePost" });
}
Применение атрибутов ActionName
и HttpVerb
к действиям контроллера
[HttpGet]
[ActionName("SinglePost")]
public JsonResult Get(string id)
{
return Json(_service.Get(id));
}
[HttpDelete]
[ActionName("SinglePost")]
public JsonResult Delete(string id)
{
return Json(_service.Delete(id));
}
[HttpPost]
[ActionName("SinglePost")]
public JsonResult Create(Post post)
{
return Json(_service.Save(post));
}
[HttpPut]
[ActionName("SinglePost")]
public JsonResult Update(Post post)
{
return Json(_service.Update(post););
}
Метод 2: уникальные маршруты + ограничения глагола с атрибутом глагола Http для действий контроллера
Регистрация уникальных маршрутов в Global.asax
с помощью HttpMethodContraint
var postsUrl = "api/posts";
routes.MapRoute("posts-get", postsUrl + "/{id}",
new { controller = "Posts", action = "Get",
new { httpMethod = new HttpMethodConstraint("GET") });
routes.MapRoute("posts-create", postsUrl,
new { controller = "Posts", action = "Create",
new { httpMethod = new HttpMethodConstraint("POST") });
routes.MapRoute("posts-update", postsUrl,
new { controller = "Posts", action = "Update",
new { httpMethod = new HttpMethodConstraint("PUT") });
routes.MapRoute("posts-delete", postsUrl + "/{id}",
new { controller = "Posts", action = "Delete",
new { httpMethod = new HttpMethodConstraint("DELETE") });
Использовать только атрибут глагола Http в действиях контроллера
[HttpGet]
public JsonResult Get(string id)
{
return Json(_service.Get(id));
}
[HttpDelete]
public JsonResult Delete(string id)
{
return Json(_service.Delete(id));
}
[HttpPost]
public JsonResult Create(Post post)
{
return Json(_service.Save(post));
}
[HttpPut]
public JsonResult Update(Post post)
{
return Json(_service.Update(post););
}
Оба эти метода позволяют мне иметь уникальные методы Controller Action Methods и позволяют использовать маршруты RESTful, связанные с глаголами ... но чем принципиально отличается ограничение маршрута от использования имени действия прокси?