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