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

.NET MVC中HttpDelete返回405错误,新版无web.config如何解决?

解决ASP.NET Core MVC中HttpDelete返回405方法不允许的问题

首先得明确:你说的「新版.NET MVC」应该是ASP.NET Core MVC,它确实不再使用传统的web.config(转而用appsettings.json和启动类配置),下面针对你的场景给出几个可行的解决方向:

1. 确保请求方式与路由匹配

你的Delete方法目前没有指定路由参数(还注释掉了id参数),如果前端请求没正确匹配到这个方法的路由,或者请求方式不是DELETE,就会返回405。

先给控制器和方法加上清晰的路由配置,同时优化数据库连接的资源管理:

[Route("[controller]/[action]")]
public class YourController : Controller
{
    [HttpDelete("{id:int}")] // 明确绑定路由参数与HTTP DELETE方法
    public ActionResult Delete(int id)
    {
        // 用using自动释放数据库连接,避免资源泄漏
        using(var conn = new MySqlConnection(connectionString()))
        {
            conn.Open();
            var userId = HttpContext.Session.GetString("userId");
            var stm = "Delete from lex_reminders where reminder_id=@id";
            using(var cmd = new MySqlCommand(stm, conn))
            {
                cmd.Parameters.AddWithValue("@id", id); // 用传入的动态ID替代硬编码25
                int res = cmd.ExecuteNonQuery();
                
                if(res > 0)
                {
                    Create(userId);
                    return View("Create");
                }
                else
                {
                    return View("Error");
                }
            }
        }
    }

    // 你的connectionString()方法和Create()方法保持不变
}

2. 跨域场景下配置CORS允许DELETE方法

如果你的请求是跨域的(比如前端和后端不在同一域名),需要在Program.cs中配置CORS规则,明确允许DELETE方法:

var builder = WebApplication.CreateBuilder(args);

// 添加CORS服务
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowDelete", policy =>
    {
        policy.WithOrigins("你的前端域名") // 建议指定具体域名,不要用AllowAnyOrigin
              .AllowAnyHeader()
              .WithMethods("GET", "POST", "DELETE"); // 明确包含DELETE方法
    });
});

// 添加MVC服务
builder.Services.AddControllersWithViews();

var app = builder.Build();

// 启用CORS(必须放在UseRouting和UseEndpoints之间)
app.UseCors("AllowDelete");

app.UseRouting();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

3. HTML表单提交DELETE的特殊处理

HTML原生表单只支持GET和POST方法,如果你是用表单提交删除请求,需要通过方法覆盖来模拟DELETE:

步骤1:添加方法覆盖中间件

在Program.cs中注册中间件:

builder.Services.AddControllersWithViews(options =>
{
    options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
});

// 启用HTTP方法覆盖中间件
app.UseMiddleware<HttpMethodOverrideMiddleware>();

步骤2:在表单中添加隐藏字段

<form asp-action="Delete" asp-route-id="25" method="post">
    @Html.AntiForgeryToken()
    <!-- 添加隐藏字段指定实际请求方法为DELETE -->
    <input type="hidden" name="X-HTTP-Method-Override" value="DELETE" />
    <button type="submit">确认删除</button>
</form>

更推荐的方式:用AJAX发送DELETE请求

直接通过JS发送标准的DELETE请求,示例:

// 先获取防伪令牌,避免跨站请求伪造错误
const token = document.querySelector('input[name="__RequestVerificationToken"]').value;

fetch('/YourController/Delete/25', {
    method: 'DELETE',
    headers: {
        'RequestVerificationToken': token
    }
})
.then(response => {
    if(response.ok){
        window.location.href = '/YourController/Create';
    } else {
        window.location.href = '/YourController/Error';
    }
});

4. 检查安全中间件是否限制DELETE

如果你的项目启用了HSTS或自定义安全策略,确保没有误拦截DELETE方法。比如Program.cs中的UseHsts()一般不会影响,但如果有自定义的授权规则,需要确认允许DELETE请求的访问权限。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 15:47:57