Wep Api - метод 405 не допускается

У меня есть проект Web Api с контроллером, который имеет методы для GET, DELETE, POST и PUT.

Когда я пытаюсь выполнить POST или PUT для этого контроллера, я всегда получаю ошибку 405 Method Not Allowed. Передаваемые данные выглядят корректно, это просто объект с шестью простыми свойствами. Я установил точку останова в моем методе, и, как и ожидалось, в этом случае он не был достигнут. Я зарегистрировал DelegatingHandler (упомянутый в Web Api - метод Catch 405 Not Allowed) для проверки входящего запроса и исходящего ответа, и я могу сказать, что мой запрос обрабатывается Api (то есть проблема не с клиентом). Я также использовал Fiddler для проверки запроса / ответа, а заголовки ответа говорят в разделе Безопасность, Разрешить: УДАЛИТЬ, ПОЛУЧИТЬ.

Это ясно говорит мне, что PUT и POST недопустимы по какой-либо причине, хотя у меня есть методы, украшенные атрибутами [HttpPost] и [HttpPut], и, насколько я могу судить, правильно настроили маршрутизацию. Я использую маршрутизацию по умолчанию, но также есть методы, которые используют атрибутную маршрутизацию.

Это звучит так, как будто может быть какая-то проблема безопасности, однако я могу выполнить POST и PUT на других своих контроллерах и не вижу различий, которые, как я считаю, могут быть причиной проблемы.

Вот фрагмент моего кода:

public class PricesController : ApiController
{
    // DELETE: api/Prices/5
    [HttpDelete]
    [ResponseType(typeof(Price))]
    [Route("api/Prices/{id:int}")]
    public async Task<IHttpActionResult> DeletePrice(int id)
    {
      // code omitted
    }

    // GET: api/Prices/5
    [HttpGet]
    [ResponseType(typeof(Price))]
    [Route("api/Prices/{id:int}")]
    public async Task<IHttpActionResult> GetPrice(int id)
    {
      // code omitted
    }

    // GET: api/Prices
    [HttpGet]
    [Route("api/Prices")]
    public IQueryable<Price> GetPrices()
    {
      // code omitted
    }

    // POST: api/Prices
    [HttpPost]
    [ResponseType(typeof(Price))]
    [Route("api/Prices", Name = "Prices")]
    public async Task<IHttpActionResult> PostPrice(Price price)
    {
      // code omitted
    }

    // PUT: api/Prices/5
    [HttpPut]
    [ResponseType(typeof(void))]
    [Route("api/Prices/{id:int}")]
    public async Task<IHttpActionResult> PutPrice(int id, Price price)
    {
      // code omitted
    }
}

Любая помощь будет оценена. Я провел весь день, пытаясь понять это.

1 ответ

Похоже, что это не обязательно правильно.

Можете ли вы попробовать украсить Price с помощью [FromBody] перед этим в ваших действиях?

PostPrice([FromBody] Price price)
Другие вопросы по тегам