如何在IIS中为ASP.NET MVC启用HTTP PUT和DELETE?

我在ASP.NET MVC3应用程序中使用HTTP PUTDELETE 。 当我在本地运行它时,所有东西都能正常工作。 但是,当我将应用程序发布到服务器时,这些方法不起作用。

是否有任何特殊的设置来启用Web服务器来支持PUTDELETE请求? 我正在使用与IIS 7.5共享主机。

更新:

我在IIS manager启用PUTDELETE请求。 PUT命令工作正常。 但是DELETE仍然不起作用。 我通过jQuery创build请求:

我在这个页面:

 http://domain.com/dashboard/edit-site/103323/links/ 

和我的阿贾克斯电话是:

 $.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 } }); 

这将创build一个这样的请求:

 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 

转到您的IISpipe理器中的 处理程序映射 。 查找ExtensionlessUrlHandler-Integrated-4.0 ,双击它。 单击请求限制…button,在动词选项卡上添加DELETEPUT在这里输入图像说明


编辑:可能的WebDav发布者问题

你已经提到了你在2008服务器上运行的已删除的文章吗? 尝试删除webDavangular色,或从您的网站config禁用它:在system.webServer – > modules部分,删除WebDAVModule模块:

 <system.webServer> <modules> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> </handlers> </system.webServer> 

如果您在生产环境中在PUTDELETE上的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设置,并添加所需的pathverbs

Finnaly我觉得答案很侥幸。 我把jQuery调用改成了下面的tho,现在运行的很好。

 $.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 ? 虽然在当地有它,工作正常吗?

您只需在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>