В результате предыдущего вопроса я обнаружил два способа обработки маршрутов 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);); }
Оба эти метода позволяют мне иметь уникальные методы действий контроллера и разрешать маршруты RESTful, привязанные к глаголам... но что по сути отличается от ограничения маршрута и использования имени действия прокси?