WEB API 2 Delete返回405

时间:2015-01-11 18:03:16

标签: asp.net http asp.net-web-api2 http-delete

我试图在我的网络API类中创建删除功能。 我之前使用Put和Patch Http消息时遇到了问题,因为这些消息被链接到WebDAV。 更改后,Patch和Put工作正常,但删除给我带来了问题。

这是我的班级:

[RoutePrefix("api/Account")]
public class AccountController : ApiController
{
     //private AuthRepository _repo = null;
    Orchestrate.Net.Orchestrate orchestrate = new Orchestrate.Net.Orchestrate("0b42c04c-0d70-4da8-a3c1-2036882369d0");

[..rest of class here..]

// DELETE: api/account/5
[AllowAnonymous]
[HttpDelete]
public void Delete(string username)
{
   orchestrate.Delete("users", username, true);
}

}

我试过了:

  • 使用IHttpActionResult
  • 使用int作为标识符删除方法的几个不同变体
  • 更改web.config
  • 在Delete方法本身上添加路由定义

在浏览网页时,我发现很多人的Web.Config文件都有问题,但我觉得很好。这是每个人都在谈论的部分。

  <system.webServer>
    <modules>   <remove name="WebDAVModule"/> </modules>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <remove name="WebDAV" />
      <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>

这是我的要求:

DELETE http://localhost:41021/api/account/JoopSloop HTTP/1.1
Host: localhost:41021
Connection: keep-alive
Accept: application/json, text/plain, */*
Origin: http://localhost:48898
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36
Authorization: Bearer -AqDRUMrrBNGICNUGIiSn0-gxTBUzElKupPPO9m1bCj0KHA9Z74vnOrPCxU-sTAWlfymTCDD3WGdFETC0-20zXOVSB7aStVHtCFrr-u9zogsUWfdiSicNzZQE3xrbyiFTB71GuwFjchx8xHIFI_6qHB26E2EKITwlFSi7X7p-lo6WWd4Z12SdL02ZxOI1wyZ8MQiXN47X6ZvuDKC6B_rJGQ2qh5p8pA8quZ0p8TvDLrPG6IuXv1U8jjS1iZCTVXO
Referer: http://localhost:48898/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4

答案如下:

{"message":"The requested resource does not support http method 'DELETE'."}

所以我开始非常绝望了。

4 个答案:

答案 0 :(得分:6)

还想添加别人告诉我的另一个答案:

如果你在路线配置中有这个:

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

您的ID应始终被称为id,并且不能以其他名称命名:

这不起作用

//api/account/useridvalue
[Authorize]
[HttpDelete]
public IHttpActionResult Delete(string whatEverYourNameis){
     //Do delete logic here
     Return Ok();
}

这样做

//api/account/useridvalue
[Authorize]
[HttpDelete]
public IHttpActionResult Delete(string id){
     //Do delete logic here
     Return Ok();
}

答案 1 :(得分:1)

您的控制器名为AccountController,该方法称为“删除” - 因此您不需要发送HTTP DELETE / api / account / delete / JoopSloop以便将请求与方法匹配。

答案 2 :(得分:1)

我在代码中添加了以下内容以使其正常工作:

    // DELETE: api/account/Janjaap/Admin
    [Authorize]
    [HttpDelete]
    [Route("delete/{account}/{user}")]
    public IHttpActionResult DeleteUser(string account, string user){
         //Do delete logic here
         Return Ok();
    }

我还没有真正解决刚用路径装饰方法的初始问题。我尝试使用的初始路线是Route("/delete"),这也会导致问题。删除第一个/是必须的。

答案 3 :(得分:0)

如果有人在httprequest中只有DELETE和PUT这个问题。 我有它,它通过删除WebDav解决了。 https://inedo.com/support/kb/1140/disabling-webdav-in-iis