API веб-API для имени действия

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

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

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

http://mysite/services/methodfruit

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

http://mysite/api/services

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

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

Ответ 1

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

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

Маршрутизация в веб-интерфейсе ASP.NET

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

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

При использовании шаблона маршрутизации по умолчанию 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" };
}

Ответ 2

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

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

Затем вы можете просто сделать запрос GET для

http://mysite/api/Services/MethodFruit

Ответ 3

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

Контроллер
p >

    [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 } );

Ответ 4

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

using System.Web.Mvc; 

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

using System.Web.Http 

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