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

Chr*_*ris 114 asp.net-mvc http-status-code-405 asp.net-mvc-4

我很感激任何帮助,因为该网站应该今晚上线!

我有一个带有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>
Run Code Online (Sandbox Code Playgroud)

我也试图在IIS中更改处理程序映射和请求筛选无济于事.请注意,IIS中的WebDAV创作规则似乎已被禁用.

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

Chr*_*ris 191

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

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- ADD THIS -->
    </modules>
    ... rest of settings here
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助

  • 对于那些只是复制粘贴的人:runAllManagedModulesForAllRequests ="true"并不是真正需要的,实际上可以打破其他东西. (11认同)
  • @ZarShardan(和其他人)仅供参考:如果删除runAllManagedModulesForAllRequests ="true"属性,您还需要在<handlers>节点下添加<remove name ="WebDAV"/>. (4认同)
  • 也在这里工作.但有人能解释一下与WebDAVModule的关系吗? (3认同)
  • 我还必须根据 http://stackoverflow.com/a/6698096/254156 在处理程序部分添加删除 (2认同)

ale*_*eha 61

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

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

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

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

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)


Hug*_*opp 31

就我而言,上述解决方案都没有奏效.这是因为我已经改变了参数的名字在我的Delete方法.

我有

public void Delete(string Questionid)
Run Code Online (Sandbox Code Playgroud)

代替

public void Delete(string id)
Run Code Online (Sandbox Code Playgroud)

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

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

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


Pav*_*bin 13

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;
    }
});
Run Code Online (Sandbox Code Playgroud)

千万不能使用这样的:

...
data: {id:id}
...
Run Code Online (Sandbox Code Playgroud)

就像你使用这个POST方法一样.


Nit*_*ran 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>
Run Code Online (Sandbox Code Playgroud)


Abh*_* B. 5

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

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

<system.webServer>
   <modules>
       <remove name="WebDAVModule" />
   </modules>
   <handlers>
     <remove name="WebDAV" />
   </handlers>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)