17

我在 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,任何人都可以看到我可能出错的地方吗?作为参考,api 的 url 可以,因为我也将相同的 api 控制器用于其他功能。

selectedClient() 也是通过 WebApi 接收的 Client 对象,因此应该与 PUT 完美匹配。

4

5 回答 5

23

如果您使用 IIS7 并安装了 WebDav,请尝试将其删除。我只在使用 PUT 动词时遇到了同样的错误,它解决了这个问题

更新:您可以在此处阅读有关 WebDav 的信息:http ://www.iis.net/learn/get-started/whats-new-in-iis-7/what39s-new-for-webdav-and-iis-7

于 2012-11-29T07:17:14.257 回答
5

您的 UpdateClient 操作是否有 [HttpPut] 属性?另外,您是否有将 {action} 作为 routeTemplate 的路由?例如:

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

还有一件事,在你的 ajax 代码中尝试使用 'application/json' 而不是 'json'。

于 2012-10-09T20:45:30.717 回答
2

看起来这两行是错误的,我将它们更改如下:

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

现在进去了。

于 2012-10-09T20:44:27.990 回答
1

给未来的疑难解答者的注意事项:当我的“Put”控制器无意中期待一个未使用的附加参数时,我收到了这个错误。

于 2015-08-20T23:49:10.347 回答
0

我的问题是,在项目属性下,我使用的是本地 IIS 而不是 IIS Express,它默认为端口 80,它阻止了 DELETE 请求。更改为 IIS Express 修复了它。

于 2015-11-10T15:40:04.670 回答