76

我在我的 ASP.NET MVC3 应用程序中PUT使用HTTP 。DELETE当我在本地运行它时,一切正常;但是当我将应用程序发布到服务器时,这些方法不起作用。

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

更新:

我启用PUTDELETE请求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
4

6 回答 6

102

转到IIS 管理器中的处理程序映射。找到,双击它。单击Request Restrictions...按钮,然后在 Verbs 选项卡上,添加和。 ExtensionlessUrlHandler-Integrated-4.0DELETEPUT在此处输入图像描述


编辑:可能的 WebDav Publisher 问题

您在 2008 年服务器上运行的已删除帖子中提到过,对吗?尝试删除webDav角色,或从您的站点禁用它config:在system.webServer->modules部分,删除WebDAVModule模块:

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>
于 2012-09-16T00:38:55.010 回答
55

如果您在 asp.net web api 的生产环境中遇到以下错误,PUT或者DELETE这些方法在本地运行良好。

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

于 2016-12-14T12:49:57.333 回答
16

您只需要在 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>
于 2017-06-10T12:49:40.567 回答
0

最后我发现答案很侥幸。我将 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吗?在本地时它已经并且工作正常?

于 2012-09-17T20:02:12.227 回答
0

正确的做法是找出真正的阻碍者,然后删​​除这个来源,而不是四处猜测。请在此处检查如何:https ://stackoverflow.com/a/70530342/592651

于 2021-12-30T10:30:46.693 回答
0

我遇到了同样的问题。你们只能访问服务器部署 API 并卸载 WebDAV 并完成。你可以参考这个

https://achrafbenalaya.com/2020/10/17/405-method-not-allowed-in-iis/

于 2021-10-04T16:23:01.987 回答