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

.NET Core 2.2 MVC项目POST请求返回405 Method Not Allowed错误排查

405错误排查及解决方案

核心原因说明

405 Method Not Allowed错误本质是请求使用的HTTP方法(本次为POST)与后端接口允许的方法不匹配,或是路由匹配失败导致请求落到了不支持POST的端点上,也可能是服务端配置/中间件拦截了POST请求。

针对当前场景的修复步骤

  • 修正后端Action参数绑定特性
    你当前代码没有给DTO参数加绑定特性,.NET Core无法正确识别参数来源会导致路由匹配失败,按你提交方式二选一修改:
    1. 仅提交普通字段(无文件)用JSON格式提交,添加[FromBody]特性:
    [AllowAnonymous]
    [HttpPost("[action]")]
    public async Task<ActionResult<ApplicationUser>> RegisterUser([FromBody] RegisterUserDTO UsuarioDTO)
    {
        // 业务代码
        return Ok();
    }
    
    1. 需要提交文件用FormData格式提交,添加[FromForm]特性:
    [AllowAnonymous]
    [HttpPost("[action]")]
    public async Task<ActionResult<ApplicationUser>> RegisterUser([FromForm] RegisterUserDTO UsuarioDTO)
    {
        // 业务代码
        return Ok();
    }
    
  • 对应修正前端AJAX配置
    你当前代码混用了JSON和FormData两种提交模式的配置,导致参数格式不匹配:
    1. 无文件用JSON提交,删除processData: false配置即可:
    $.ajax({
        url: '@Url.Action("RegisterUser", "RegisterUser")',
        method: 'post',
        datatype: "json",
        contentType: 'application/json',
        async: false,
        data: JSON.stringify(dataObject),
        // 其余回调逻辑不变
    })
    
    1. 有文件用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逻辑不变
        });
    });
    
  • 检查路由匹配规则
    1. 确认控制器类名为RegisterUserController,且继承自Controller/ControllerBase
    2. 确认控制器类上没有加额外的路由前缀覆盖默认路由,导致@Url.Action生成的地址与后端[HttpPost("[action]")]的路由不匹配
    3. 确认控制器下没有同名的无[HttpGet]特性的RegisterUser方法,否则路由系统会优先匹配无特性的Action,导致POST请求被拒绝
  • 检查服务端配置
    1. 确认Startup.cs中app.UseMvc()放在身份验证、跨域等中间件之后,若有跨域需求,需配置跨域规则允许OPTIONS预检请求
    2. 若项目托管在IIS上,WebDAV模块会拦截部分POST请求,可在Web.config中添加配置禁用:
    <system.webServer>
      <modules runAllManagedModulesForAllRequests="false">
        <remove name="WebDAVModule" />
      </modules>
      <handlers>
        <remove name="WebDAV" />
      </handlers>
    </system.webServer>
    

内容的提问来源于stack exchange,提问作者Abel C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:18:04