跨项目调用ASP.NET Web API出现405方法不允许问题求助
嘿,这个问题我太熟了!拆分Web API和MVC项目后遇到405方法不允许,基本都是跨域限制或者WebDAV搞的鬼,给你梳理下服务器端要做的几个关键配置:
一、开启跨域资源共享(CORS)
现在两个项目是独立站点,哪怕都是本地运行,只要端口不同就属于跨域请求,浏览器的同源策略会直接拦截,这是最常见的原因。
- 第一步先给Web API装CORS包:
打开NuGet包管理器控制台,运行:Install-Package Microsoft.AspNet.WebApi.Cors - 然后在
WebApiConfig.cs里启用并配置CORS:
开发阶段如果想临时允许所有源测试,可以把第一个参数改成using System.Web.Http; using System.Web.Http.Cors; public static class WebApiConfig { public static void Register(HttpConfiguration config) { // 把这里的地址换成你MVC项目实际运行的地址,比如http://localhost:5000 var corsSettings = new EnableCorsAttribute("http://localhost:5000", "*", "*"); config.EnableCors(corsSettings); // 保留原有的路由配置 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }"*",但生产环境一定要指定具体域名,别用通配符。
二、禁用WebDAV模块
IIS默认的WebDAV模块会偷偷拦截PUT、DELETE这些HTTP方法,哪怕是GET请求偶尔也会踩坑,必须在Web API的web.config里把它关掉:
在<system.webServer>节点下添加这段配置:
<modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers>
这样就能彻底移除WebDAV的干扰,让你的API方法正常接收对应请求。
三、确认API路由和HTTP方法匹配
拆分项目后可能不小心改了路由,或者控制器方法没明确标记HTTP特性,也会导致405:
- 给API控制器的方法加上
[HttpGet]、[HttpPost]这类特性,明确允许的请求方法,比如:public class ProductsController : ApiController { [HttpGet] // 明确这是GET请求 public IHttpActionResult GetProducts() { // 业务逻辑 return Ok(productList); } [HttpPost] // 明确这是POST请求 public IHttpActionResult AddProduct(Product model) { // 业务逻辑 return CreatedAtRoute("DefaultApi", new { id = model.Id }, model); } } - 检查
WebApiConfig.cs里的路由模板,确保和你MVC页面Ajax调用的URL完全匹配。
四、调试时的小细节
如果用IIS Express运行,确保两个项目的端口不冲突。另外,如果你的Ajax请求带了自定义请求头(比如Authorization),记得在CORS配置的第二个参数里明确允许这些头,比如把"*"换成"Content-Type,Authorization"。
内容的提问来源于stack exchange,提问作者as90
相关产品推荐
相关产品推荐

