使用Entity Framework构建Web API,调用DELETE接口遇localhost/api未找到错误
解决AJAX DELETE请求到Web API时的404未找到错误
我来帮你排查这个404问题,这种情况通常是几个关键环节出了疏漏,咱们一步步来梳理:
1. 先补全并修正AJAX请求的URL
你目前的代码里url:...是不完整的,这大概率是核心问题之一。首先得拿到要删除数据的ID,然后构造出和Web API路由完全匹配的URL。
举个完整的示例,假设你的按钮上用data-id属性存了记录的ID:
@section scripts{ <script> $(document).ready(function () { var table = $('#myTable').DataTable(); $("#myTable .js-delete").on("click", function () { var button = $(this); var id = button.data("id"); // 从按钮的data属性获取ID // 这里可以保留你之前的bootbox确认逻辑 bootbox.confirm("Do you want to delete this movie?", function (result) { if (result) { $.ajax({ url: `/api/movies/${id}`, // 替换成你的API控制器路径+ID,比如api/[控制器名]/ID type: "DELETE", success: function() { // 删除成功后同步更新DataTable table.row(button.closest("tr")).remove().draw(); }, error: function(xhr) { console.log("删除失败:", xhr.responseText); } }); } }); }); }); </script> }
记得要保证这个URL和你的Web API后端路由完全对应,比如如果你的控制器是MoviesController,那基础路由就是api/movies,加上ID后就是api/movies/1这种格式。
2. 验证Web API的DELETE动作配置
接下来检查你的后端控制器是否正确配置了DELETE路由:
[Route("api/[controller]")] [ApiController] public class MoviesController : ControllerBase { private readonly YourDbContext _context; public MoviesController(YourDbContext context) { _context = context; } // 确保标注了HttpDelete特性,并且路由参数和方法参数一致 [HttpDelete("{id}")] public IActionResult Delete(int id) { var movie = _context.Movies.Find(id); if (movie == null) { return NotFound(); // 这里的404是因为实体不存在,和路由错误的404要区分开 } _context.Movies.Remove(movie); _context.SaveChanges(); return NoContent(); // DELETE请求成功通常返回204 No Content } }
注意:如果你的ID不是int类型,要同步修改方法参数和路由里的{id}约束,比如{id:guid}。
3. 排查WebDAV模块拦截问题
有些情况下,ASP.NET默认的WebDAV模块会拦截DELETE请求,导致请求无法到达你的API控制器。你可以在web.config里移除这个模块:
<system.webServer> <modules> <remove name="WebDAVModule" /> </modules> <handlers> <remove name="WebDAV" /> </handlers> </system.webServer>
4. 确认请求方法是否正确
一定要在AJAX配置里明确指定type: "DELETE",如果写成POST或者其他方法,Web API的路由系统会找不到对应的动作方法,直接返回404。
先从URL和后端路由匹配这一步开始排查,这是最常见的触发404的原因,解决后再测试其他环节。
内容的提问来源于stack exchange,提问作者Anthino Russo
相关产品推荐
相关产品推荐

