2

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

我试过了

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

一切都无济于事,全部返回 404。如果我将 DELETE 类型更改为 GET,那么服务运行 GET 命令非常好。

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

编辑:

我正在调用这样的 DELETE 方法(中介是 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>
4

3 回答 3

2

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

对于 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 GO TO : %userprofile%\documents\iisexpress\config\ 并在 applicationHost.config 文件中执行相同操作。

于 2014-04-12T07:17:46.707 回答
0

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

我对 PUT 和 DELETE 有同样的问题,解决方法是成功的。

于 2012-09-07T09:07:39.467 回答
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 更新控制器,如下所示:

[RoutePrefix("api/files")]
public class FileController : ApiController
{
}
于 2015-08-14T05:35:44.373 回答