2012-05-15 3 views
2

В WCF REST я могу определить строгий шаблон URL.ASP.NET MVC Web API 4 - сложные шаблоны URL-адресов

В ASP.NET MVC Web API 4 У меня проблема.

Я зарегистрировал маршрут в обычном режиме:

routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

Мой контроллер иметь этот метод:

// POST /api/documents 
public HttpResponseMessage<Document> Post(Document document) 
{...} 

Если я отправить POST-запрос с этим URL «http://servername.com: 53835/api/Documents/"(параметр" 1337 "не должен быть там), он вызывает метод Post (Document document). Но я хочу, чтобы в этом случае инфраструктура обнаружила ошибку. (например, «Нет API-вызова, найденного для этого запроса»).

С REST WCF я мог настроить это строго ... Я не настолько в восторге от этой «конвенции по конфигурации» ...

И как я могу сделать больше Complexe шаблоны URL?

  • Я хочу что-то вроде этого:

АНИ для GET-запроса с этим URL-шаблон: "http://servername.com:53835/api/Documents/1337" для получения определенного документа-объекта (содержит метаданные, такие как дата создания, создатель и т. д.).

Другой GET-запрос должен получить сам файл (в виде потока), с этим URL: http://servername.com:53835/api/Documents/1337/File

Как я могу определить эту разницу? ГЭТ-метод для получения документа-объекта выглядит следующим образом:

// GET /api/documents/5 
public HttpResponseMessage<Document> Get(int id) 
{...} 

Как я могу определить отдельный метод с теми же параметрами (в данном случае «ид»)? Нужно ли настраивать шаблон URL с атрибутами метода, например, в WCF REST-Projects?

я могу изменить маршрутизацию для {действия} заполнителем, как это:

routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{mandant}/{controller}/{id}/{action}", 
       defaults: new { mandant = "profile", id = RouteParameter.Optional, action = RouteParameter .Optional} 
      ); 

И тогда я могу использовать метод атрибутов [ActionName ("Файл")] и [AcceptVerbs ("GET")] лежат так:

[ActionName("File")] 
[AcceptVerbs("GET")] 
public HttpResponseMessage FileDownload(int id) 

Тогда я могу назвать: "http://servername.com:53835/api/Documents/1337/File", чтобы получить файл. Но что, если я хочу больше этих «действий»?

  • Более сложным вариантом использования будет URL-адрес с повторяющимися частями. Что-то вроде: (в этом случае у меня есть характеристика какого-то элемента.Количество это характеристики должны быть переменными)

http://servername.com:53835/api/Documents/characteristic_1/characteristic_2/characteristic_3 http://servername.com:53835/api/Documents/characteristic_1/characteristic_2

часть с характеристиками должна быть динамической/переменными.

ответ

0

Я тоже общаюсь с этим, и я узнал, что этот подход может привести к нежелательным результатам во многих случаях и каким-то образом затрудняет использование API. Для меня лучше всего иметь только один входной параметр для моего метода API, который является идентификатором, и передавать все остальные переменные с использованием URL-параметров.

Чтобы избежать сухих материалов, вы можете рассмотреть возможность создания ActionFilter или так далее.

+0

Что такое ActionFilter? Я нашел не очень много о WebApi-ActionFilter. Что я могу с ними сделать? – user437899

Смежные вопросы