2017-02-15 16 views
2

Ниже приведено действие WebAPI. На прибегая к помощи о следующей ошибке: -Как исправить - запрошенный ресурс не поддерживает метод http 'POST'

The requested resource does not support http method 'POST'

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

Но все же при вызове выше по сообщению человек бросает ошибку.

Error

Как избавиться от этой ошибки ??

Также можно исправить это, не используя атрибут [FromBody] в списке параметров метода?

Любая помощь/предложение высоко оценены. Спасибо.

+0

возможно, есть другое действие под названием «переименовать». и [Route ("rename/{userId}/{type}/{title} /")] не соответствует вашему URL-адресу запроса. – levent

+0

@levent, проверено. ничего такого –

ответ

1

Вы объявили маршрут, который требует параметры URL

[Route("rename/{userId}/{type}/{title}/")] 

Итак, когда вы посылаете запрос на api/customer/rename он не соответствует этому методу. Вы должны удалить параметры, которые вы передаете в теле запроса от параметров маршрута

[Route("rename")] 

Убедитесь, что у вас есть соответствующий RoutePrefix("api/customer") атрибут на контроллере.


Вторая проблема - несколько параметров [FromBody]. Вы получите не может связывать несколько параметров ошибка. Существует ограничение - вы можете отметить только один параметр как FromBody. См Sending Simple Types примечания:

Web API reads the request body at most once, so only one parameter of an action can come from the request body. If you need to get multiple values from the request body, define a complex type.

Вы должны создать сложный тип, который будет содержать все параметры

public class RenameModel 
{ 
    public int UserId { get; set; } 
    public string Type { get; set; } 
    public string Title { get; set; } 
} 

И изменить метод подписи

[HttpPost] 
[Route("rename")] 
public IHttpActionResult Rename(RenameModel model) 

и отправить запрос данных в качестве приложения/x- www-form-urlencoded

+0

Я пробовал ваши входные данные. С той же ошибкой !! –

+0

Несколько '[FromBody]' отлично, или это может быть причиной? –

+0

@ Kgn-web извините, не было. Да, это тоже проблема. Обновленный ответ. Убедитесь, что также префикс маршрута: 'api/customer' –

0
[Route("rename/{userId}/{type}/{title}/")] 
public IHttpActionResult Rename([FromBody] int userId, [FromBody] string type, [FromBody] string title) 

Последний ответ правильный, вы запрашиваете эти параметры на маршруте, но говорите, что ожидаете их в теле сообщения. Кроме того, обычно маршрут начинался с существительного, а не из глагола. Что вы переименовываете? (Т.е.[Маршрут ("пользователи/переименовывать/{идентификатор пользователя}/{тип}/{название}")]

Основываясь на своем начальном посте, попробуйте вместо этого:

[HttpPost] 
[Route("rename/{userId}/{type}/{title}" Name = "RenameUser"] 
public IHttpActionResult Rename(int userId, string type, string title) 
{ 
    _myServiceMethod.Rename(userId, type, title); 
    return new StatusCodeResult(HttpStatusCode.Created, this); 
} 

Или, если вы хотите сделать пост с информацией в организме: Объявить свой контракт данных:

public class User 
{ 
    public string Type { get; set; } 
    public string Title { get; set; } 
} 

Тогда на конечной точке:

[HttpPost] 
[Route("rename/{userId}", Name = "RenameUserPost")] 
public IHttpActionResult RenameUserPost(int userId, [FromBody] User userData) 
{ 
    return new StatusCodeResult(HttpStatusCode.Created, this); 
} 

Обратите внимание, что в обоих возвратах «это» относится к вашему классу контроллера, который наследуется от ApiController. Проверяются оба из них в swagger, и они принимают POST и возвращают коды состояния.

Надеюсь, это поможет.

+0

Что такое атрибут Name? –

+0

Несколько [FromBody] в порядке или это может быть причиной? –

+0

Именование маршрута используется для генерации ссылок, если, например, вы хотели использовать тип ответа «Созданный» (Uri location, T Content), вы могли бы использовать либо ручной рулонный хелпер или что-то вроде Ploeh.Hyprlinkr, чтобы динамически получать Uris название маршрута. Таким образом, если вы измените маршрут, ссылка будет по-прежнему верна. – jeffj23