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

136

今晚网站即将上线,希望能得到任何帮助!

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

HTTP错误405.0-方法不允许使用 您要查找的页面无法显示,因为正在使用无效的方法(HTTP动词)

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

<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创作规则似乎被禁用了。

非常感谢任何想法。

15个回答

228

我最终找到了解决方案!如果你遇到同样的问题,把以下内容添加到你的web.config文件中。

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

2
我还必须根据https://dev59.com/dmw15IYBdhLWcg3wT5_2#6698096在处理程序部分添加一个删除。 - rrrr-o
3
也在这里工作过。但是有人能解释一下与WebDAVModule的关系吗? - Boas Enkler
11
那些只是复制粘贴的人:runAllManagedModulesForAllRequests="true"并不是真正必要的,实际上它可能会破坏其他东西。 Translated: 对于那些只是复制粘贴的人来说,runAllManagedModulesForAllRequests="true"并不是必须的,而且实际上可能会破坏其他内容。请留意。 - Zar Shardan
5
提醒:如果删除runAllManagedModulesForAllRequests="true"属性,则还需要在<handlers>节点下添加<remove name="WebDAV" />。 - Aaron
您也可以从ISS管理器中执行此操作(模块,然后处理程序 - 删除WebDAV)。 - Gerino
显示剩余3条评论

75

在某些情况下,仅从模块中删除它可能会导致以下错误:

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

模块:IIS Web Core 通知:ExecuteRequestHandler"

解决方案在这里提出。还需要从处理程序中删除它。

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

38

在我的情况下,以上解决方案都不起作用。这是因为我已经更改了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 }
        );

我是从这里得到的解决方案。


1
在我的情况下,我已经使用不同的参数名称定义了 [Route(...)],与实际方法不同。 - apc

15

HTTP的Javascript DELETE动词必须像这样:

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

10
如果您正在使用IIS 7.0或更高版本,则此问题主要与IIS服务器上的WebDAV扩展模块有关。这通常发生在使用Post或Delete操作时。请尝试在web.config中进行以下设置。
<system.webServer>
   <modules>
       <remove name="WebDAVModule" />
   </modules>
   <handlers>
     <remove name="WebDAV" />
   </handlers>
</system.webServer>

8

在尝试了这里几乎所有的解决方案后,这个对我有效。将其添加到您的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>

对我也起作用了。谢谢! - Berk Cinaz

4
请打开applicationHost.config文件(通常在C:\Windows\System32\inetsrv\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" />

1
如果您不想(或无法)修改机器范围的配置文件,则可以使用另一个答案中提供的方法在自己的web.config中删除这些处理程序。 - Ekus

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
在我的情况下,我错过了将{id}添加到[Route("")]中,导致我遇到了相同的错误。 添加后,问题得到了解决:[Route("{id}")]。最初的回答

1

我遇到了类似的问题,但是针对PUT方法其他建议都没有起作用。

然而,我的id参数使用的是int类型而不是默认的string类型。在路由中添加{id:int}解决了我的问题。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接