ASP.NET WebApi中带HttpPost特性的Delete接口返回405问题求助
解决ASP.NET WebApi中Post请求Delete Action返回405的问题
我来帮你搞定这个405错误的问题!你遇到的情况其实是ASP.NET WebApi里很常见的几个小坑导致的,咱们一步步解决:
1. 检查HttpPost特性的命名空间(最可能的根源)
你的代码里引用了System.Web.Mvc的HttpPost特性,但你的控制器继承的是System.Web.Http.ApiController(WebApi专属控制器),这俩完全不是一个体系的!WebApi必须使用System.Web.Http命名空间下的HttpPost特性才能生效。
修正代码的步骤:
- 替换引用:把
using System.Web.Mvc;换成using System.Web.Http; - 确保
[HttpPost]特性来自正确的命名空间
修正后的代码示例:
using System.Web.Http; namespace ECIS.Mobile.OpenApi.WebApi.Controllers.Manager { public class AdController : ApiController { [HttpPost] public int Delete(int id) { return 1; } } }
2. 调整WebApi路由配置,确保请求能匹配到Action
如果上面的修改还没解决问题,大概率是路由规则没正确匹配你的Post请求。这里有两种解决方案:
方法A:使用特性路由(推荐)
直接给Delete Action加上路由特性,明确指定请求路径和允许的Http方法,避免路由歧义:
[HttpPost] [Route("api/Ad/Delete")] // 路径可根据你的实际路由前缀调整 public int Delete(int id) { return 1; }
记得要在WebApiConfig.cs里先启用特性路由:
public static void Register(HttpConfiguration config) { // 启用特性路由 config.MapHttpAttributeRoutes(); // 其他默认路由配置... }
方法B:修改默认路由规则
如果习惯用传统的路由配置,把WebApi的默认路由模板改成包含action参数,这样就能通过Action名称匹配请求:
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } );
之后你就可以通过POST /api/Ad/Delete?id=1这样的请求访问到目标Action了。
3. 禁用WebDAV模块(解决潜在的请求拦截问题)
有时候IIS自带的WebDAV模块会拦截Delete相关的请求,导致莫名其妙的405错误。可以在web.config里直接禁用它:
<system.webServer> <modules> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> </handlers> </system.webServer>
按照这个顺序排查,基本就能解决你的问题啦!
内容的提问来源于stack exchange,提问作者Joeries
相关产品推荐
相关产品推荐

