2013-09-06 2 views
12

Мне нужен контроллер, чтобы возвращать JSON для использования JavaScript, поэтому я унаследовал от класса ApiController, но он не ведет себя так, как я ожидал. Книга Apress Pro ASP.NET MVC 4 и большинство онлайн примеров я нашел привести примеры, как:URL-адрес веб-API для имени действия

public class ServicesController : ApiController 
{ 
    public string[] MethodFruit() 
    { 
     return new string[] { "Apple", "Orange", "Banana" }; 
} 

доступны через URL:

http://mysite/services/methodfruit 

Но это никогда не работает - ресурс ISN Не нашел. Единственный подход, который я могу получить работу, чтобы иметь контроллер содержит другой метод для каждого глагола HTTP, а затем:

http://mysite/api/services 

Что вызывает метод GET.

Я проверил сайт Apress, но у них нет форумов и текущий исходный код находится в VS 2012, который я не использую. Я изучил исходные файлы, и они, похоже, думают, что прежний подход должен работать. Не поддерживается ли прежний подход?

ответ

27

Да ... обычно вам нужно следовать стандарту именования по умолчанию, ожидаемому API-интерфейсом ASP.NET.

Проверить этот официальный документ:

Routing in ASP.NET Web API

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

Маршрутизация по имени Действие

с шаблоном маршрутизации по умолчанию, Web API использует метод HTTP для выберите действие. Тем не менее, вы можете также создать маршрут, где название действие включается в URI:

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

В вашем случае, вы должны сделать это:

[HttpGet] 
public string[] MethodFruit() 
{ 
    return new string[] { "Apple", "Orange", "Banana" }; 
} 
+0

Спасибо. Я прочитаю этот документ. – David

+1

Я сделал то же самое. Но я хочу, чтобы эта функция вызывалась по запросу «POST». Я добавил '{action}' в маршрут и добавил '[AcceptVerbs (« GET »,« POST »)]' вместо '[HttpGet]'. Но он говорит 404 при доступе к этому API, делая запрос на отправку. Когда нет проблемы с 'GET'. Мое имя действия - «GetAuthToken». Я действительно не могу решить эту проблему. Пожалуйста помоги. – shashwat

+0

@shashwat проверить, если это решает вашу проблему: http://stackoverflow.com/a/12766431/114029 –

6

Если вы хотите Web API для поиска имени действия при маршрутизации, изменять класс WebApiConfig.cs в папке App_Start к этому:

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

Тогда вы можете J усть сделать запрос GET к

http://mysite/api/Services/MethodFruit 
+0

Я пропустил WebApiConfig. cs класс полностью. Теперь это имеет гораздо больше смысла - я задавался вопросом, почему класс RouteConfig не изменился ... – David

4

Я добавляю дополнительную информацию о ответе выше .. Добавление RoutePrefix исправит этот вопрос ..Надеюсь, что это помогает

контроллер

[RoutePrefix("api/Services")] 
    public class ServicesController : ApiController 
    { 
     [System.Web.Http.AcceptVerbs("GET", "POST")] 
     [System.Web.Http.HttpGet] 
     [Route("MethodFruit")] 
     public string[] MethodFruit() 
     { 
      return new string[] { "Apple", "Orange", "Banana" }; 
     } 
    } 

В конфигурации

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

Использование [RoutePrefix («api/referencedata»)] и [Route («products»)] в методе действий было единственной вещью это сработало для меня. Сбой при использовании [Route ("api/referencedata")] [ActionName ("products")] – MartinS

0

я столкнулся с аналогичной проблемой, я обнаружил, что на моем коде

using System.Web.Mvc; 

я импортированной Mvc с использованием System.Web.Http. , поэтому он использовал маршрутизацию Mvc не webApi. я заменил, что с

using System.Web.Http 

и это работает для меня. я добавляю свой ответ, чтобы новички не повторяли ту же ошибку

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