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

ASP.NET Core MVC调用API时作者更新/删除功能异常求助

问题排查: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 20:35:55