.NET Core 2.2 MVC项目POST请求返回405 Method Not Allowed错误排查
405错误排查及解决方案
核心原因说明
405 Method Not Allowed错误本质是请求使用的HTTP方法(本次为POST)与后端接口允许的方法不匹配,或是路由匹配失败导致请求落到了不支持POST的端点上,也可能是服务端配置/中间件拦截了POST请求。
针对当前场景的修复步骤
- 修正后端Action参数绑定特性
你当前代码没有给DTO参数加绑定特性,.NET Core无法正确识别参数来源会导致路由匹配失败,按你提交方式二选一修改:- 仅提交普通字段(无文件)用JSON格式提交,添加
[FromBody]特性:
[AllowAnonymous] [HttpPost("[action]")] public async Task<ActionResult<ApplicationUser>> RegisterUser([FromBody] RegisterUserDTO UsuarioDTO) { // 业务代码 return Ok(); }- 需要提交文件用FormData格式提交,添加
[FromForm]特性:
[AllowAnonymous] [HttpPost("[action]")] public async Task<ActionResult<ApplicationUser>> RegisterUser([FromForm] RegisterUserDTO UsuarioDTO) { // 业务代码 return Ok(); } - 仅提交普通字段(无文件)用JSON格式提交,添加
- 对应修正前端AJAX配置
你当前代码混用了JSON和FormData两种提交模式的配置,导致参数格式不匹配:- 无文件用JSON提交,删除
processData: false配置即可:
$.ajax({ url: '@Url.Action("RegisterUser", "RegisterUser")', method: 'post', datatype: "json", contentType: 'application/json', async: false, data: JSON.stringify(dataObject), // 其余回调逻辑不变 })- 有文件用FormData提交,修改为如下配置:
$(function () { $("#FrmData").submit(function (e) { e.preventDefault(); // 用FormData封装所有字段和文件 var formData = new FormData(this); // 额外字段可手动追加:formData.append("字段名", "字段值") // 文件可手动追加:formData.append("file1", $("#文件选择框ID")[0].files[0]) $.ajax({ url: '@Url.Action("RegisterUser", "RegisterUser")', method: 'post', datatype: "json", contentType: false, // 让浏览器自动生成带分隔符的请求头 processData: false, // 禁止jQuery处理FormData async: false, data: formData, success: function (result) { swal({ title: "Usuario", text: "Registrado con éxito", type: "success" }, function () { window.location.href = "@Url.Action("RegisterUser", "RegisterUser")"; }); }, error: function (XMLHttpRequest, textStatus, errorThrown) { swal("Error", XMLHttpRequest.responseText, "error") } }) // 后续done/fail/always逻辑不变 }); }); - 无文件用JSON提交,删除
- 检查路由匹配规则
- 确认控制器类名为
RegisterUserController,且继承自Controller/ControllerBase - 确认控制器类上没有加额外的路由前缀覆盖默认路由,导致
@Url.Action生成的地址与后端[HttpPost("[action]")]的路由不匹配 - 确认控制器下没有同名的无
[HttpGet]特性的RegisterUser方法,否则路由系统会优先匹配无特性的Action,导致POST请求被拒绝
- 确认控制器类名为
- 检查服务端配置
- 确认Startup.cs中
app.UseMvc()放在身份验证、跨域等中间件之后,若有跨域需求,需配置跨域规则允许OPTIONS预检请求 - 若项目托管在IIS上,WebDAV模块会拦截部分POST请求,可在Web.config中添加配置禁用:
<system.webServer> <modules runAllManagedModulesForAllRequests="false"> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> </handlers> </system.webServer> - 确认Startup.cs中
内容的提问来源于stack exchange,提问作者Abel C
相关产品推荐
相关产品推荐

