.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
相关产品推荐
相关产品推荐

