我在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方法不允许,任何人都可以看到我可能出错的地方?作为参考,api的url是可以的,因为我也使用相同的api控制器来执行其他功能。
selectedClient()也是通过WebApi接收的Client对象,因此应该与PUT完全匹配。
答案 0 :(得分:23)
如果您使用的是IIS7并安装了WebDav,请尝试将其删除。 我只用PUT动词得到同样的错误,它解决了问题
更新:您可以在此处阅读有关WebDav的信息:http://www.iis.net/learn/get-started/whats-new-in-iis-7/what39s-new-for-webdav-and-iis-7
答案 1 :(得分:5)
您的UpdateClient操作是否有[HttpPut]属性?另外,你有一条路线接受{action}作为routeTemplate吗?例如:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
还有一件事,请尝试'application / json'作为ajax代码中的content-type而不是'json'。
答案 2 :(得分:2)
看起来这两行是错的,我按如下方式更改了它们:
contentType: 'application/json',
data: "{client: " + ko.toJSON(model.selectedClient()) + "}",
现在进入。
答案 3 :(得分:1)
注意未来的问题排查工具:当我的" Put"控制器无意中期望一个未被使用的附加参数。
答案 4 :(得分:0)
我的问题是,在项目属性下,我使用的是本地IIS而不是IIS Express,它默认为阻止DELETE请求的端口80。更改为IIS Express修复了它。