Маршрут веб-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, который я не использую. Я изучил исходные файлы, и они, кажется, думают, что первый подход должен работать. Прежний подход больше не поддерживается?


person Dave    schedule 06.09.2013    source источник


Ответы (4)


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

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

Маршрутизация в ASP.NET Web API< /а>

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

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

В шаблоне маршрутизации по умолчанию веб-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" };
}
person Leniel Maccaferri    schedule 06.09.2013

Если вы хотите, чтобы веб-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
person Mahesh    schedule 06.09.2013
comment
Я полностью пропустил класс WebApiConfig.cs. Теперь это имеет гораздо больше смысла - мне было интересно, почему класс RouteConfig не изменился... - person Dave; 06.09.2013

Добавление дополнительной информации к приведенному выше ответу. Добавление 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 } );
person Praveen M P    schedule 18.02.2016
comment
Использование [RoutePrefix(api/referencedata)] и [Route(products)] в методе действия было единственным, что сработало для меня. Сбой при использовании [Route(api/referencedata)][ActionName(products)] - person MartinS; 21.04.2016

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

using System.Web.Mvc; 

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

using System.Web.Http 

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

person Uttam Ughareja    schedule 11.01.2018