У меня есть следующее действие с ApiController:
public string Something()
{
return "value";
}
И я настроил свои маршруты следующим образом:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
В бета-версии это работало нормально, но я только что обновился до последней версии Release Candidate и теперь вижу такие ошибки при вызовах, как это:
Запрошенный ресурс не поддерживает HTTP-метод GET.
Почему это больше не работает?
(Полагаю, я мог бы избавиться от {action} и просто сделать тонну контроллеров, но это кажется беспорядочным.)
источник
Вся приведенная выше информация верна, я также хотел бы отметить, что
[AcceptVerbs()]
аннотация существует как в пространствах имен System.Web.Mvc, так и в System.Web.Http.Вы хотите использовать System.Web.Http, если это контроллер веб-API.
источник
Хотя это не ответ на OP, у меня была точно такая же ошибка с совершенно другой основной причиной; так что, если это поможет кому-то еще ...
Проблема для меня заключалась в неверно названном параметре метода, из-за которого WebAPI неожиданно маршрутизировал запрос. В моем ProgrammesController есть следующие методы:
[HttpGet] public Programme GetProgrammeById(int id) { ... } [HttpDelete] public bool DeleteProgramme(int programmeId) { ... }
Запросы DELETE к ... / api / programs / 3 направлялись не на DeleteProgramme, как я ожидал, а на GetProgrammeById, потому что у DeleteProgramme не было имени параметра id. GetProgrammeById тогда, конечно, отклонял DELETE, поскольку он помечен как принимающий только GET.
Итак, исправление было простым:
[HttpDelete] public bool DeleteProgramme(int id) { ... }
И все хорошо. Это действительно глупая ошибка, но ее трудно отладить.
источник
Если вы украшаете свой метод
HttpGet
, добавьтеusing
в верхнюю часть контроллера следующее:using System.Web.Http;
Если вы используете
System.Web.Mvc
, то может возникнуть эта проблема.источник
Это, безусловно, переход от бета-версии к RC. В примере, приведенном в вопросе, теперь вам нужно украсить свое действие с помощью [HttpGet] или [AcceptVerbs ("GET")].
Это вызывает проблему, если вы хотите смешивать действия на основе глаголов (например, «GetSomething», «PostSomething») с действиями, не основанными на глаголах. Если вы попытаетесь использовать указанные выше атрибуты, это вызовет конфликт с любым действием на основе глагола в вашем контроллере. Один из способов возбудиться, это определить отдельные маршруты для каждого глагола и установить действие по умолчанию для имени глагола. Этот подход можно использовать для определения дочерних ресурсов в вашем API. Например, следующий код поддерживает: «/ resource / id / children», где id и children являются необязательными.
context.Routes.MapHttpRoute( name: "Api_Get", routeTemplate: "{controller}/{id}/{action}", defaults: new { id = RouteParameter.Optional, action = "Get" }, constraints: new { httpMethod = new HttpMethodConstraint("GET") } ); context.Routes.MapHttpRoute( name: "Api_Post", routeTemplate: "{controller}/{id}/{action}", defaults: new { id = RouteParameter.Optional, action = "Post" }, constraints: new { httpMethod = new HttpMethodConstraint("POST") } );
Надеюсь, будущие версии веб-API будут лучше поддерживать этот сценарий. В настоящее время в проекте aspnetwebstack codeplex, http://aspnetwebstack.codeplex.com/workitem/184 зарегистрирована проблема . Если вы хотели бы это увидеть, пожалуйста, проголосуйте по этому вопросу.
источник
Используйте ту же настройку, что и OP. Один контроллер с множеством действий ... менее "беспорядочный" :-)
В моем случае я забыл «[HttpGet]» при добавлении нового действия.
[HttpGet] public IEnumerable<string> TestApiCall() { return new string[] { "aa", "bb" }; }
источник
Та же проблема, что и выше, но корень сильно отличается. Для меня это было то, что я попал в конечную точку с правилом перезаписи https. Нажатие на http вызвало ошибку, работало как ожидалось с https.
источник
Замените следующий код в этом пути
Путь :
App_Start => WebApiConfig.cs
Код:
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}/{Param}", defaults: new { id = RouteParameter.Optional, Param = RouteParameter.Optional } );
источник
Я не знаю, может ли это быть связано с сообщением OP, но мне не хватало аннотации [HttpGet], и это было причиной ошибки, как указано в методах @dinesh_ravva, по умолчанию предполагается, что это HttpPost.
источник
Моя проблема была так же проста, как наличие нулевой ссылки, которая не отображалась в возвращенном сообщении, мне пришлось отлаживать свой API, чтобы увидеть ее.
источник