ASP.NET Core MVC调用API时作者更新/删除功能异常求助
问题概述
直接调用API时,作者的更新、删除操作可正常执行;但通过ASP.NET Core MVC发起调用时,更新操作触发404 Not Found,删除操作触发405 Method Not Allowed。创建作者功能可正常工作,推测问题出在路由匹配上。
修复方案
1. 更新操作404错误修复
问题原因
API的AuthorController已通过[Route("api/[controller]/[action]")]定义了控制器级路由模板,其中[action]会自动替换为方法名。但Update方法额外添加了[HttpPost("Update")],导致最终路由变为api/Author/Update/Update,而MVC调用的路径是api/Author/Update,路径不匹配引发404。
修复步骤
将API中Update方法的[HttpPost("Update")]改为[HttpPost],移除多余的路径参数:
[HttpPost] // 移除括号内的"Update" public async Task<IActionResult> Update([FromForm] UpdateAuthorDTO model) { if (!ModelState.IsValid) { return BadRequest(ModelState); } await _authorService.Update(model); return Ok(); }
2. 删除操作405错误修复
问题原因
405错误表示请求方法不被允许,结合直接调用API正常的情况,核心原因是路由匹配异常:MVC调用的路径可能匹配到了API中其他仅接受POST/GET请求的方法,而非预期的Delete方法。
修复步骤
步骤1:确认路由匹配正确性
API的Delete方法路由为api/Author/Delete/{id}(控制器路由api/[controller]/[action] + 方法路由[HttpDelete("{id}")]),MVC调用的路径$"{uri}/api/Author/Delete/{id}"本身是正确的,但需检查:
- 确保
uri变量是API的根地址(如https://localhost:7296),未重复添加/api后缀(避免生成https://localhost:7296/api/api/Author/Delete/{id}这类错误路径)。 - 确认API中没有同名的
Delete方法(如POST类型的Delete方法)导致路由覆盖。
步骤2:可选优化路由定义
若上述检查无误,可直接为Delete方法指定完整路由,避免控制器路由的潜在影响:
[HttpDelete("api/Author/Delete/{id}")] // 明确指定完整路由 public async Task<IActionResult> Delete(int id) { var author = await _authorService.GetById(id); if (author == null) { return NotFound(new { message = "Yazar bulunamadı" }); } await _authorService.Delete(id); return NoContent(); }
步骤3:MVC端调试验证
在MVC的Delete方法中添加日志,确认请求的URL和方法是否正确:
var requestUrl = $"{uri}/api/Author/Delete/{id}"; Console.WriteLine($"发送DELETE请求到:{requestUrl}"); var response = await httpClient.DeleteAsync(requestUrl);
修改后的API核心代码片段
[Route("api/[controller]/[action]")] [ApiController] public class AuthorController : ControllerBase { private readonly IAuthorService _authorService; public AuthorController(IAuthorService authorService) { _authorService = authorService; } // 其他方法保持不变 // 修复后的Update方法 [HttpPost] public async Task<IActionResult> Update([FromForm] UpdateAuthorDTO model) { if (!ModelState.IsValid) { return BadRequest(ModelState); } await _authorService.Update(model); return Ok(); } // 修复后的Delete方法 [HttpDelete("{id}")] public async Task<IActionResult> Delete(int id) { var author = await _authorService.GetById(id); if (author == null) { return NotFound(new { message = "Yazar bulunamadı" }); } await _authorService.Delete(id); return NoContent(); } }
内容的提问来源于stack exchange,提问作者Mert Sevim

