Метод веб-API 2 не разрешен (405)

Я создал проект Web Api 2 по умолчанию в VS2013. Мое действие PUT в моем контроллере выглядит так:

    // PUT: api/Events/5
    [HttpPut]
    [ResponseType(typeof(void))]
    public IHttpActionResult PutEvent(int id, Event @event)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (id != @event.Id)
        {
            return BadRequest();
        }

        db.Entry(@event).State = EntityState.Modified;

        try
        {
            db.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!EventExists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return StatusCode(HttpStatusCode.NoContent);
    }

Мой web.config выглядит так:

<handlers>
      <remove name="WebDAV"/>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>

И у меня есть следующий код в моем WebConfig.cs

// Web API routes
config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
);

Когда я запускаю проект и пытаюсь сделать вызов (PUT с необработанными данными json) в API с помощью Postman, сервер возвращается с:

Запрошенный ресурс не поддерживает http-метод PUT.

Я просмотрел этот пост, но не вижу, что Делаю по другому (Разве что добавил <remove name="WebDAV" />). Но без него тоже не работает.


person kwv84    schedule 13.01.2016    source источник
comment
Вы используете HttpPut, поэтому вы можете получить идентификатор не из URL-адреса, а из [FromBody] или [FromUrl] в качестве аргумента параметра.   -  person gaurav bhavsar    schedule 13.01.2016
comment
Ваш контроллер называется EventsController? Ваш Event @event должен иметь атрибут [FromBody]   -  person Alexey    schedule 13.01.2016
comment
@gauravbhavsar проблема была в id. Когда я удалил его, проблема была решена   -  person kwv84    schedule 13.01.2016
comment
@ kwv84 хорошо, что вы решили проблему, пожалуйста, обновите свои исправления.   -  person gaurav bhavsar    schedule 13.01.2016


Ответы (1)


Оказалось, что мне пришлось изменить действие PUT и удалить идентификатор:

// PUT: api/Events/5
[HttpPut]
[ResponseType(typeof(void))]
public IHttpActionResult PutEvent(int id, Event @event)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    if (id != @event.Id)
    {
        return BadRequest();
    }

    db.Entry(@event).State = EntityState.Modified;

    try
    {
        db.SaveChanges();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!EventExists(id))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }

    return StatusCode(HttpStatusCode.NoContent);
}
person kwv84    schedule 13.01.2016