我在ASP.NET MVC3应用程序中使用HTTP PUT
和DELETE
。当我在当地运行它时,每件事都能正常工作;但是当我将应用程序发布到服务器时,这些方法不起作用。
是否有任何特殊设置可让网络服务器支持PUT
和DELETE
请求?我正在使用IIS 7.5的共享主机。
更新
我在PUT
中启用了DELETE
和IIS manager
个请求。 PUT
命令工作正常。但是DELETE
仍然不起作用。我按jQuery
创建请求:
我在这页面:
http://domain.com/dashboard/edit-site/103323/links/
我的ajax电话是:
$.ajax({
// url: same as page-url,
cache: false,
type: 'DELETE',
data: { linkid: $(link).data("linkid") },
beforeSend: function () {
// doing something in UI
},
complete: function () {
// doing something in UI
},
success: function (data) {
// doing something in UI
},
error: function () {
// doing something in UI
}
});
这将创建一个这样的请求:
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://domain.com
Referer: http://domain.com/dashboard/edit-site/103323/links/
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
X-Requested-With: XMLHttpRequest
使用 Form Data
:
linkid:104044
答案 0 :(得分:71)
转到 IIS管理器中的处理程序映射。找到ExtensionlessUrlHandler-Integrated-4.0
,双击它。点击请求限制... 按钮,然后在动词标签上添加DELETE
和PUT
。
编辑:可能的WebDav Publisher问题
您是否已提及您在2008服务器上运行的已删除帖子?尝试删除 webDav 角色,或从您的网站config
停用该角色:system.webServer
- > modules
部分,删除WebDAVModule
模块:
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>
答案 1 :(得分:33)
如果您在PUT
或DELETE
上的asp.net web api中的生产环境中出现以下错误,尽管这些方法在本地工作正常。
405 - 不允许使用用于访问此页面的http动词。
只需在服务器的web.config
中添加以下设置即可<system.webServer>
<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>
<modules>
<remove name="WebDAVModule" />
</modules>
</system.webServer>
原因:webDAV模块默认阻止PUT / DELETE方法。首先删除此模块及其处理程序。我们首先删除任何现有的ExtensionlessUrlHandler-Integrated-4.0设置,并将其添加到所需的path
和verbs
。
答案 2 :(得分:8)
您只需在web.config
中添加以下代码行<system.webServer>
<security>
<requestFiltering>
<verbs allowUnlisted="false">
<add verb="GET" allowed="true" />
<add verb="POST" allowed="true" />
<add verb="DELETE" allowed="true" />
<add verb="PUT" allowed="true" />
</verbs>
</requestFiltering>
</security>
和
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
答案 3 :(得分:2)
最后我发现答案不稳定。我将jQuery调用更改为下面的内容,现在它运行良好。
$.ajax({
url: this.href + "?linkid=" + $(link).data("linkid"),
cache: false,
type: 'DELETE',
// data: { linkid: $(link).data("linkid") },
beforeSend: function () {
// doing something in UI
},
complete: function () {
// doing something in UI
},
success: function (data) {
// doing something in UI
},
error: function () {
// doing something in UI
}
});
您有DELETE
来电, Form Data
的原因,您有什么解释吗?虽然在当地它已经并且工作得很好?