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

时间:2012-09-15 19:16:08

标签: c# asp.net-mvc-3 iis-7.5 http-put http-delete

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

是否有任何特殊设置可让网络服务器支持PUTDELETE请求?我正在使用IIS 7.5的共享主机。

更新

我在PUT中启用了DELETEIIS 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

4 个答案:

答案 0 :(得分:71)

转到 IIS管理器中的处理程序映射。找到ExtensionlessUrlHandler-Integrated-4.0,双击它。点击请求限制... 按钮,然后在动词标签上添加DELETEPUTenter image description here


编辑:可能的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)

如果您在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

答案 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 的原因,您有什么解释吗?虽然在当地它已经并且工作得很好?