WebAPI删除不起作用-不允许使用405方法


120

感谢您对此网站的帮助,因为该网站应该在今晚上线!

我有一个带有Delete方法的Web API控制器。该方法可以在运行IIS Express(Windows 8)的本地计算机上正常运行,但是一旦将其部署到实时IIS服务器(Windows Server 2008 R2),它就会停止工作并抛出以下错误消息:

HTTP错误405.0-不允许使用的方法由于使用了无效的方法(HTTP Verb),因此无法显示正在寻找的页面

我在网上寻找解决方案,并实施了最合理的解决方案。我的网络配置具有以下设置:

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
<handlers>
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>

我还尝试将IIS中的处理程序映射和请求筛选更改为无效。请注意,IIS中的WebDAV创作规则似乎已被禁用。

任何想法将不胜感激谢谢。

Answers:


199

我终于找到了解决方案!如果您遇到相同的问题,请将以下内容添加到web.config中

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- ADD THIS -->
    </modules>
    ... rest of settings here

我希望这有帮助



3
也曾在这里工作。但是有人可以向我解释与WebDAVModule的关系吗?
— Boas Enkler 2013年

11
对于只复制粘贴的用户:runAllManagedModulesForAllRequests =“ true”并不是真正需要的,它实际上可以破坏其他东西。
— Zar Shardan 2014年

其他一些Web帖子将建议使用“ IIS模块”部分删除该模块,这会禁用它,但仍然会导致此/类似问题,这是最可靠的方法
— Anthony Main

4
@ZarShardan(及其他)仅供参考:如果删除runAllManagedModulesForAllRequests =“ true”属性,则还需要在<handlers>节点下添加<remove name =“ WebDAV” />。
— 亚伦

65

在某些情况下,仅从模块中删除它可能会产生下一个错误:

500.21处理程序“ WebDAV”的模块列表中有一个错误的模块“ WebDAVModule”

模块:IIS Web核心通知:ExecuteRequestHandler”

建议解决方案在这里。还需要将其从处理程序中删除。

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

1
这对我来说有效,但是有人可以阐明WebDAV到底是什么吗?
— Nazrul Muhaimin

31

就我而言,以上解决方案均无效。这是因为我已经改变了参数的名字在我的Delete方法。

我有

public void Delete(string Questionid)

代替

public void Delete(string id)

我需要使用id名称,因为那是在WebApiConfig文件中声明的名称。注意id第三和第四行中的名称:

            config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

我从这里得到了这个解决方案。


15

HTTP DELETE动词的JavaScript 必须是这样的:

$.ajax({
    **url: "/api/SomeController/" + id,**
    type: "DELETE",
    dataType: "json",
    success: function(data, statusText) {
        alert(data);
    },
    error: function(request, textStatus, error) {
        alert(error);
        debugger;
    }
});

千万不能使用这样的:

...
data: {id:id}
...

就像您使用该POST方法时一样。


1
@Pavel,您好,如果您确实使用的是完全RESTful实现。不幸的是,并不是每个人都这样做,并且看到开发人员使用POST而不是DELETE等是很常见的。感谢您澄清这一点。
— 克里斯(Chris)

5

在尝试了这里几乎所有的解决方案之后,这对我有用。将此添加到您的API配置文件中

<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>

尝试了很多东西,这行得通。.NET版本4.6.1-谢谢。
— Ketan

4

如果您使用的是IIS 7.0或更高版本。此问题主要与IIS服务器上的WebDAV扩展模块有关。这是在使用“发布或删除”操作时发生的。

请尝试在Web配置中进行以下设置

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

3

我也遇到了同样的问题,我正在打电话给WebAPi并收到此错误。在web.config中为服务添加以下配置解决了我的问题

    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- add this -->
    </modules>

在web.config文件中解决了我的问题。这是我从客户端打电话的方式

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(environment.ServiceUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    HttpResponseMessage response = client.DeleteAsync("api/Producer/" + _nopProducerId).Result;
    if (response.IsSuccessStatusCode)
    {
        string strResult = response.Content.ReadAsAsync<string>().Result;
    }
}

2

转到applicationHost.config(通常在C:\ Windows \ System32 \ inetsrv \ config下)文件,并在applicationHost.config中注释掉以下行

1)在<handlers>下:

<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />

2)还注释掉上述处理程序在<modules>下引用的以下模块

<add name="WebDAVModule" />

如果您不想(或无法)修改计算机范围的配置文件,请使用其他答案stackoverflow.com/a/47907578/1754743在您自己的web.config中删除这些处理程序
— Ekus

2

就我而言,我错过了添加{id}到的操作[Route("")],但遇到了同样的错误。补充一点为我解决了这个问题:[Route("{id}")]


这么多小时的浪费时间,如果不是您的话,我仍然无法解决这个问题....我想知道为什么它不返回404:@
— deadManN

1

我有405错误不允许的方法,因为我省略了将WebApi控制器上的Delete方法设为公开的方法。

我花了很长时间才找到它(太长了!),因为在这种情况下,我本以为没有找到错误,所以我错误地认为我的Delete方法被拒绝了。

不允许而不是未找到的原因是,我对同一条路由也有一个Get方法(这是实现REST时的正常情况)。路由将匹配公共Get函数,然后由于错误的http方法而将其拒绝。

我知道一个简单的错误,但它可以节省其他人的时间。


1

只是添加。如果这是您的配置

config.Routes.MapHttpRoute(
            名称:“ DefaultApi”,
            routeTemplate:“ api / {controller} / {id}”,
            默认值:new {id = RouteParameter.Optional}

请继续按照Hugo所说的做,不要将Route属性设置为控制器的get方法,这对我来说是个问题。


0

我遇到了类似的问题,但对于PUT来说,没有其他建议对我有用。

但是我使用的int不是stringID 的默认值。添加{id:int}到路线解决了我的问题。

    [Route("api/Project/{id:int}")]
    public async Task<IHttpActionResult> Put(int id, [FromBody]EditProjectCommand value)
    {
       ...
    }

0

我们必须将自定义标头添加到web.config中,因为我们的请求有多个标头混淆了API响应。

<httpProtocol>
    <customHeaders>
        <remove name="Access-Control-Allow-Methods" />
        <remove name="Access-Control-Allow-Origin" />
        <remove name="Access-Control-Allow-Headers" />
    </customHeaders>
</httpProtocol>

-1

Delete方法顶部的[HttpPost]属性为我解决了此问题:

[HttpPost]
public void Delete(int Id)
{
  //Delete logic
}

这可能就是它为您工作的原因。我使用的是较早的版本,大约在2013年初,因此自此以来,已经修复了许多问题。很高兴知道它正在为您工作。
— 克里斯

4
老实说,这不是一个好答案。使用此方法解决了问题的人正在使用POST而不是DELETE,所以它不能也不应工作
— Alexander Derck

我相信这是因为您正在客户端使用data(即请求的正文)而不是params(即请求的url)。
— Thomas Sauvajon

我同意亚历山大·德克(Alexander Derck)的观点,这是一种争执而不是解决方案。
— 巴塞尔·赛耶(Barem Sayej),2017年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.