【问题标题】:DELETE method .NET WebAPI does not workDELETE 方法 .NET WebAPI 不起作用
【发布时间】:2012-09-01 02:14:56
【问题描述】:

我已经看到大量关于此的帖子,但我的新 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>

【问题讨论】:

  • 您如何调用DELETE 方法 - 此设置的客户端是什么?
  • (我正在考虑的问题是该请求是否被视为跨域请求 - 您是否尝试过实现 OPTIONS 并查看是否首先受到攻击?)
  • OPTIONS 提出了“不允许的方法”——同时使用 JSON 和 JSONP 作为数据类型。删除的 JSON/JSONP/XML 仍然是 404。
  • 您的应用程序池是否在“集成”托管管道模式下运行? (您的前置条件是 preCondition="integratedMode")... 可能值得在命令提示符下使用厚颜无耻的 aspnet_regiis -ir 以确保正确设置 IIS。
  • 显然我的系统上没有任何 aspnet_regiis.exe,即使在修复 .NET 4.5 时也是如此......故事还在继续......

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


【解决方案1】:

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

对于 IIS:

转到位置: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%\documents\iisexpress\config\ 并在 applicationHost.config 文件中执行相同的操作。

【讨论】:

    【解决方案2】:

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

    我在 PUT 和 DELETE 方面遇到了同样的问题,解决方法是成功的。

    【讨论】:

    • 我实际上是在 IIS Express 下运行的。尝试在一般 IIS 下运行服务时遇到许多安全问题。
    • @thedixon 你的问题是 IIS 7.5 ......但如果你实际上使用的是 IIS Express ......那么 Mark S 回答的这个问题应该有助于stackoverflow.com/questions/10906411/… (将 PUT 和 DELETE 动词添加到 %userprofile %\documents\iisexpress\config\applicationhost.config)
    【解决方案3】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-28
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多