MVC3 RESTful API Routing & Http Verb Handling

Я хочу создать RESTful Json Api для своего приложения MVC3. Мне нужна помощь с обработкой нескольких Http-глаголов для работы с одним экземпляром объекта.

То, что я читал / изучал / пробовал

Атрибуты MVC ( HttpGet , HttpPost и т. Д.), Позволяют мне иметь контроллер с несколькими действиями с одинаковым именем , но у них все равно должны быть разные сигнатуры методов.

Ограничения маршрута возникают в модуле маршрутизации до того, как сработает MVC, что приведет к тому, что у меня будет 4 явных маршрута, и все же потребуются индивидуально именованные действия контроллера.

ASP.NET MVC AcceptVerbs и регистрация маршрутов

Создание настраиваемого атрибута Http Verb можно использовать для захвата команды, используемой для доступа к действию, и последующей передачи ее в качестве аргумента при вызове действия - тогда код будет обрабатывать случаи переключения. Проблема с этим подходом заключается в том, что для некоторых методов потребуется авторизация, которая должна обрабатываться на уровне фильтра действий, а не внутри самого действия.

http://iwantmymvc.com/rest-service-mvc3


Требования / Цели

  1. Одна сигнатура маршрута для одного экземпляра объекта, MVC, как ожидается, будет обрабатывать четыре основных Http-глагола: GET, POST, PUT , УДАЛЯТЬ.

     context.MapRoute ("Api-SingleItem", "items / {id}",
    new {controller = "Items", action = "Index", id = UrlParameter.Optional}
    );
    
  2. Если в URI не передается параметр Id, действие должно обрабатывать POST и PUT .

     общедоступный индекс JsonResult (элемент элемента) {return new JsonResult (); }
    
  3. Когда параметр Id передается в URI, одно действие должно обрабатывать GET и DELETE .

     общедоступный индекс JsonResult (int id) {return new JsonResult (); }
    

Вопрос

Как я могу иметь более одного действия (с одинаковым именем и подписью метода), каждое из которых отвечает на уникальный HTTP-глагол. Желаемый пример:

[HttpGet]
public JsonResult Index(int id) { /* _repo.GetItem(id); */}

[HttpDelete]
public JsonResult Index(int id) { /* _repo.DeleteItem(id); */ }

[HttpPost]
public JsonResult Index(Item item) { /* _repo.addItem(id); */}

[HttpPut]
public JsonResult Index(Item item) { /* _repo.updateItem(id); */ }

9
задан Community 23 May 2017 в 12:21
поделиться