You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨项目调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:35:43