Подтвердить что ты не робот

405 Сообщение, метод не разрешен с помощью Web Api

У меня есть следующее на контроллере API:

public void UpdateClient(Client client)
    {
        try
        {
            if (ModelState.IsValid)
            {
                db.Entry(client).State = EntityState.Modified;
                db.SaveChanges();
            }
        }
        catch
        {
            throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
        }
    }

И на странице:

$.ajax({
            url: "api/client/UpdateClient",
            type: "PUT",
            contentType: 'json',
            data: ko.toJSON(model.selectedClient()),
            success: function (result) {
                getClients();
                $("#loader").hide();
            },
            failure: function (result) {
                alert(result.d);
                $("#loader").hide();
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert("An error occurred, please try again.");
                $("#loader").hide();
            }
        });

Но это дает ошибку 405 Method Not Allowed, может ли кто-нибудь увидеть, где я, возможно, ошибся? Для справки url для api в порядке, поскольку я использую один и тот же контроллер api для других функций.

Также выбранныйClient() является объектом Client, полученным через WebApi, поэтому должен идеально соответствовать PUT up снова.

4b9b3361

Ответ 1

Похоже, эти две строки были неправильными, я изменил их следующим образом:

contentType: 'application/json',
data: "{client: " + ko.toJSON(model.selectedClient()) + "}",

И теперь идет.

Ответ 3

У вас есть атрибут [HttpPut] в действии UpdateClient? Кроме того, у вас есть маршрут, который принимает {действие} как routeTemplate? Например:

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

Еще одна вещь, попробуйте 'application/json' для типа контента в вашем ajax-коде вместо json.

Ответ 4

Примечание для будущих разработчиков: я получил эту ошибку, когда мой контроллер "Путь" непреднамеренно ожидал дополнительного параметра, который не использовался.

Ответ 5

Моя проблема заключалась в том, что в свойствах проекта я использовал локальную IIS вместо IIS Express, и по умолчанию был назначен порт 80, который блокировал запросы DELETE. Переход на IIS Express исправил его.