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, а также любой тип с преобразователем типов, который может преобразовываться из строки. (Подробнее о преобразователях типов позже.)

чтобы исправить это, попробуйте сделать следующее:

  1. изменить url что вы отправляете, чтобы включить id в строке сообщения!--8-->

    url: '/api/Account/Users/SelectAgent?id=' + selectModel.agentId()

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

https://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#route-names