2013-09-13 2 views
1

Я изучил, как использовать API в проекте MVC, но у меня есть некоторые сомнения. (Я пишу на языке C#, прежде чем кто-либо спрашивает).Как работает и ведет себя класс ApiController?

До сих пор, я знаю, что конфигурация маршрута АНИ имеет значение в WebApiConfig классе и по умолчанию маршрут:

routeTemplate: "api/{controller}/{id}" 

Делая это, когда я скомпилировать запрос JSon Я знаю, что URI у меня есть для вызова, чтобы получить конкретный результат.
Но я хотел бы быть более точным, так я изменил маршрут АНИ к:

routeTemplate: "api/{controller}/{action}/{id}" 

С этим маршрутом я смогу построить URI непосредственно к конкретному действию (метод?) Внутри моей ApiController.

Также я узнал, что /{controller}/, создавая URI с помощью jSon, является именем класса. То есть, если класс ProductsController, то имя контроллера, которое я должен использовать для создания URI, равно /products. (Таким образом, весь URL-адрес будет /api/products).

Вот вопросы:
Если я класс ApiController назвал только Products, он узнаваем как часть URI? Или класс ApiController должен заканчиваться «Контроллером»?
Следуя руководству, я поместил свой ApiController il в ту же папку, что и другие контроллеры. Я знаю, что можно поместить Apis в разные папки. Итак, - это каждый API, автоматически распознаваемый MVC? Я имею в виду, Где бы я их не сохранил, признаны ли они API?
Если это так, Могу ли я в конечном итоге вызвать API, расположенный в другом проекте, чем тот, над которым я работаю?
Могу ли я создать единый проект (как библиотеку классов) с набором API-интерфейсов?
Изменяется ли конфигурация маршрута, если я хочу назвать API в отдельном проекте?

+1

его HTTP-запрос, JSON имеет значение только в том случае, если запрос имеет контент или заголовок Accept. – Jodrell

+0

действительно хотите URI, например 'api/Product/Get/1'? Разве глагол HTTP-запроса не определяет действие? – Jodrell

+1

@ Jodrell: Он не говорит, что хочет иметь действие под названием Get. Действие может быть любым видом, например. api/Продукты/Резюме или api/Продукты/Подробнее –

ответ

4

О, это много вопросов ...:)

Чтобы ответить на них:

Если у меня есть класс с именем ApiController только продукты, он узнаваем как часть URI? Или класс ApiController должен заканчиваться «Контроллером»?

ASP.NET Routing использует это Coonvention, поэтому, насколько я знаю, если вы назовете класс по своему усмотрению, не следуя этому соглашению, они не будут распознаны, и вы, скорее всего, получите 404. чтобы ответить на ваш вопрос, да, имя должно заканчиваться Controller, если вы не переопределите соглашение по умолчанию (см. ответ Майка Гудвина).

Следуя руководству, я поместил свой ApiController в ту же папку, что и другие контроллеры. Я знаю, что можно поместить Apis в разные папки. Итак, каждый API автоматически распознается MVC? Я имею в виду, где бы я их не сохранил, признаны ли они API?

Папка не имеет значения, ASP.NET будет искать класс, соответствующий имени. АНИ Контроллеры распознаются как контроллеры API, потому что они наследуют от основания ApiController, а не Controller один

Если да, то я мог в конечном счете вызвать API, расположенный в другом проекте, чем тот, над которым я работаю? Могу ли я создать единый проект (как библиотеку классов) с набором API? Изменяется ли конфигурация маршрута, если я хочу вызвать API в отдельном проекте?

Это неясно ... что вы подразумеваете под «вызовом» API? если API находится в другом проекте, вероятно, будет сидит на отдельном адрес ... Все, что вам нужно, это направить запрос JSON на этот адрес, поэтому, если вы используете JQuery сделать это:

$.getJSON('http://other.server/api/Controller', function(data) { ... }); 

, а не просто это:

$.getJSON('/api/Controller', function(data) { ... }); 

(Остерегайтесь проблем с межсайтовым скриптингом).

Надеюсь, что это очистит вас. Не стесняйтесь спрашивать, не имеет ли смысл что-то ...

3

В ASP.Net MVC вы можете иметь полный контроль над местоположением контроллера и его созданием путем внедрения фабрики пользовательских контроллеров.

Это класс, который реализует интерфейс IControllerFactory. Это обеспечивает методы для выбора и создания экземпляров контроллеров на основе контекста входящего запроса. Он также имеет методы для других жизненных циклов контроллера.

основы

Названия конвенция поведения, которые вы видите в стандарте MVC просто логика закодирована в контроллере по умолчанию заводских (который типа DefaultControllerFactory Funnily достаточно)

Вот пример того, как сделать контроллер клиента завод :

http://www.mgolchin.net/posts/18/dive-deep-into-mvc-icontrollerfactory

Таким образом, ответ на вопросы да, то вы можете сделать все, что вы хотите, но нет, это не все автоматически.

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