Webapi2 запрошенный ресурс не поддерживает post
Я прочитал тонну подобных сообщений, которые описывают одно и то же сообщение об ошибке, но они, похоже, не соответствуют тому, что я испытываю.
недавно я начал использовать веб-API и разорвал все мои методы MVC, где я возвращал JSON и т. д., Поэтому MVC просто отобразит html, и я вызову модели через ajax с моих контроллеров webapi.
вот странная вещь, я могу получить и опубликовать из моего домашнего apiController (так что я могу войти / зарегистрироваться и т. д.), Но я могу получить только от контроллер API в области, которую я создал. Я получаю 405 (метод не разрешен), хотя его украшают и называют так же, как и другой контроллер. Я думаю, что маршрутизация в порядке, иначе она не вернет мой первоначальный get?
маршрут
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultAreaApi",
routeTemplate: "api/{area}/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
контроллер
// Returns Model
[HttpGet]
public HttpResponseMessage SelectAgent()
// The requested resource does not support http method 'POST'.
[HttpPost]
public HttpResponseMessage SelectAgent(Guid id)
в jQuery
// Works fine
$.ajax({
type: 'POST',
url: '/api/Home/Login',
headers: options.headers,
contentType: "application/json; charset=utf-8",
dataType: 'JSON',
data: ko.toJSON(self.serverModel),
success: function (response) {
// Works fine
$.getJSON("/api/Account/Users/SelectAgent", function (model) { ....
// 405
$.ajax({
type: 'POST',
url: '/api/Account/Users/SelectAgent',
headers: options.headers,
contentType: "application/json; charset=utf-8",
dataType: 'JSON',
data: "{'id':'" + selectModel.agentId() + "'}",
success: function (response) {....
передаваемые данные кажутся прекрасными (или, по крайней мере, это было для контроллера MVC, с которым он работал).
Я не изменил домашний API Контроллер вообще, я не понимаю, как я могу опубликовать это, а не мой другой контроллер. Аргх.
любой указатели в правильном направлении было бы здорово.
3 ответов
Web API рассматривает только параметры строки запроса для основных типов данных. Таким образом, ваш пост просто смотрит на url /api/Account/Users/SelectAgent
когда вы делаете ваш пост. Отправляемые данные не учитываются при сопоставлении с функцией, так как вы не отмечаете Guid
С . Таким образом, ошибка" метод не разрешен " возвращается, потому что она отправляет ваш запрос POST вашему методу GET (без параметров).
вы можете узнать больше об этом на asp.net:
если параметр является "простым" типом, Web API пытается получить значение из URI. Простые типы включают примитивные типы .NET (int, bool, double и т. д.), а также TimeSpan, DateTime, Guid, decimal и string, а также любой тип с преобразователем типов, который может преобразовываться из строки. (Подробнее о преобразователях типов позже.)
чтобы исправить это, попробуйте сделать следующее:
-
изменить url что вы отправляете, чтобы включить
id
в строке сообщения!--8-->url: '/api/Account/Users/SelectAgent?id=' + selectModel.agentId()
-
изменить подпись действия код
FromBody
:public HttpResponseMessage SelectAgent([FromBody]Guid id)
Я знаю, это старый вопрос, но этот ответ может помочь кому-то. Изменение подписи действия для чтения идентификатора FromBody: не сработало для меня, и мне интересно, насколько легко будет передавать параметры в строку запроса, когда у вас есть сложный тип со многими полями/членами.
эта проблема является результатом того, что как традиционная, так и основанная на глаголах маршрутизация не могут использоваться в одном и том же ApiController. См.этой ссылке.
Эту проблему можно решить, добавив пустой [Route]
атрибут метода действия POST. То есть:-
[HttpPost]
[Route]
public HttpResponseMessage SelectAgent(Guid id)
когда у вас есть то же имя для Вашего сообщения и функции get, он маршрутизируется в функцию Get. Вот почему вы получаете этот ответ. Самый простой способ сегодня
[HttpPost]
[Route("api/postagent", Name ="postagent")]
public HttpResponseMessage SelectAgent(Guid id)
просто определите маршрут для вашей функции post и на стороне клиента опубликуйте его с помощью например, host + / api / postagent. более подробную информацию вы найдете по этой ссылке.
это особенно полезно, если вы создаете контроллер api, генерируя новый контроллер. Предопределенные функции будут иметь такую структуру, как метод get и post будет иметь один и тот же маршрут. вам нужно переопределить один из них или оба из них разделяют их.