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.