WEB API 2删除returns 405
WEB API 2 Delete returns 405
我正在尝试在我的网站中创建删除功能 API class。
我之前在使用 Put 和 Patch Http 消息时遇到了问题,因为这些消息被链接到 WebDAV。
更改后,Patch 和 Put 起作用了,但 Delete 给我带来了问题。
这是我的 class:
[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);
}
}
我试过:
- 使用 int 作为标识符删除方法的几种不同变体,使用 IHttpActionResult
- 改变 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'."}
所以我在这里开始变得非常绝望..
您的控制器称为 AccountController,方法称为 'delete' - 所以您不需要发送 HTTP DELETE /api/account/delete/JoopSloop 以便将请求与方法匹配。
我在我的代码中添加了以下内容以使其工作:
// 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")
,这也会导致问题。删除第一个 /
是必须的。
还想添加另一个人告诉我的答案:
如果你的路由配置中有这个:
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();
}
如果有人在 httprequest 中只有 DELETE 和 PUT 时遇到这个问题。
我有它,它通过删除 WebDav 解决了。
https://inedo.com/support/kb/1140/disabling-webdav-in-iis
我正在尝试在我的网站中创建删除功能 API class。 我之前在使用 Put 和 Patch Http 消息时遇到了问题,因为这些消息被链接到 WebDAV。 更改后,Patch 和 Put 起作用了,但 Delete 给我带来了问题。
这是我的 class:
[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);
}
}
我试过:
- 使用 int 作为标识符删除方法的几种不同变体,使用 IHttpActionResult
- 改变 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'."}
所以我在这里开始变得非常绝望..
您的控制器称为 AccountController,方法称为 'delete' - 所以您不需要发送 HTTP DELETE /api/account/delete/JoopSloop 以便将请求与方法匹配。
我在我的代码中添加了以下内容以使其工作:
// 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")
,这也会导致问题。删除第一个 /
是必须的。
还想添加另一个人告诉我的答案:
如果你的路由配置中有这个:
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();
}
如果有人在 httprequest 中只有 DELETE 和 PUT 时遇到这个问题。 我有它,它通过删除 WebDav 解决了。 https://inedo.com/support/kb/1140/disabling-webdav-in-iis