DELETE方法.NET WebAPI不起作用

时间:2012-09-07 07:53:50

标签: c# .net asp.net-web-api wcf-web-api

我看过很多关于此的帖子,但我的新WebAPI的DELETE方法根本不起作用,并使用Windows 7 32位IIS 7.5返回404。

我试过

  • 卸载WebDAV
  • 将PUT,DELETE,OPTIONS添加到ExtensionlessUrlHandler-Integrated-4.0处理程序(以及32位/ 64位处理程序)。
  • 允许所有模块运行。

全部无效,全部返回404.如果我将DELETE类型更改为GET,那么服务完全可以运行GET命令。

对此有任何其他想法的人?这让我疯狂。

编辑:

我正在调用这样的DELETE方法(mediator是jQuery调用的包装器):

mediator.publish("AjaxCall", {
                url: "/api/files/" + $(a.currentTarget).data("fileid"),
                type: "DELETE",
                }
            });

和WebAPI:

// DELETE api/<controller>/5
// [HttpDelete] - Tried this too
public void Delete(int fileId)
{
     Files.DeleteFile(fileId);
}

相关的web.config:

<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>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="WebDAVModule" />
    </modules>

3 个答案:

答案 0 :(得分:1)

解决方案是添加PUT&amp;在正确的applicationHost.config文件中删除动词。

对于IIS:

转到lcation:C:\ Windows \ System32 \ inetsrv \ config 并将applicationHost.config文件编辑为:

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

对于IIS EXPRESS转到: %USERPROFILE%\文件\ iisexpress \设置\ 并在applicationHost.config文件中执行相同的操作。

答案 1 :(得分:0)

您是否在“默认网站”下托管? 如果是,则尝试在不同的端口上单独托管。

我对PUT和DELETE也有同样的问题,并且解决方法也很成功。

答案 2 :(得分:0)

如果您正在使用属性路由,请使用DELETE和PUT方法更新 AcceptVerbs ,如下所示:

[Route("{fileId:int}")]
[AcceptVerbs("DELETE")]
public void Delete(int fileId)
{
   Files.DeleteFile(fileId);
}

此外,如果您将 fileId 写为参数名称,请不要忘记将webAPI路由配置更新为 api / files / {fileId}

并且还为GET和PUT使用 AcceptVerbs 属性,因为这三个具有相同的URL结构来调用它们的方法。还使用RoutePrefix更新Controller,如下所示:

[RoutePrefix("api/files")]
public class FileController : ApiController
{
}