部署到IIS后AngularJS $http.put请求返回405错误
问题:ASP.NET + AngularJS项目部署IIS后PUT请求返回405错误
本地用Visual Studio测试时,$http.put请求可正常更新数据库,但部署到IIS服务器后始终返回405状态码。
相关代码
前端请求代码
$http.put(req, oB).then(function(r) { DoSomething(oB.Id); })
(对象oB在调用该请求的函数中定义)
后端ASP.NET控制器代码
[HttpPut("{id}")] public async Task<ActionResult> PutOb(int id, Object ob) { if (id != ob.Id) { return BadRequest(); } var oldOb= _context.Object.Where(x => x.Id == ob.Id).FirstOrDefault(); oldOb.Name = ob.Name; _context.Entry(oldOb).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!obExisit(id)) { return NotFound(); } else { throw; } } return NoContent(); }
已尝试去掉.then直接调用put,错误未解决。
失败请求跟踪日志信息
启用IIS失败请求跟踪后,日志显示:
- 模块:WebDAV Module
- 通知:MAP_REQUEST_HANDLER
- 处理程序:ExtensionlessUrlHandler-Integrated-4.0
- 错误代码:0x00000000
- 核心原因:WebDAV模块拦截了PUT请求,导致方法被禁止
解决方案
1. 禁用WebDAV模块
在项目的web.config中添加以下配置,阻止WebDAV拦截PUT/DELETE等HTTP动词:
<system.webServer> <modules runAllManagedModulesForAllRequests="false"> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> </handlers> </system.webServer>
2. 确认IIS允许PUT动词
- 打开IIS管理器,定位到目标站点
- 进入「请求筛选」功能,切换到「HTTP动词」标签
- 检查列表中是否包含PUT,若没有则手动添加并允许
3. 验证路由匹配
确认前端req变量对应的URL格式与后端路由一致,例如后端路由为[HttpPut("{id}")],则请求URL应为/api/控制器名/目标ID(如/api/Objects/123),确保id参数正确传递。
内容的提问来源于stack exchange,提问作者Alaa
相关产品推荐
相关产品推荐

