【问题标题】:ASP.NET CORE Web API - delete action not firing (404 not found)ASP.NET CORE Web API - 删除操作未触发(未找到 404)
【发布时间】:2017-05-27 14:37:06
【问题描述】:

我有一个简单的 CRUD 操作控制器。所有操作都需要最后一个名为 Delete 的操作,即 HTTP DELETE 操作。当我尝试使用示例 url 调用删除操作时:

http://localhost/api/groups/1/attendances/10

然后应用程序返回 404 Not Found 并且操作未触发。

在我的其他控制器中,删除操作正常工作。一个区别是,在其他控制器中,我在控制器上而不是在每个操作上都有一个路由属性。这是个问题?

public class AttendancesController : Controller
{
  public AttendancesController(IGroupService groupService, IAttendanceService attendanceService, IPersonService personService, IPersonAttendanceService personAttendanceService)
  {
     //
  }

  [Route("api/groups/{groupId}/[controller]")]
  [HttpGet]
  public IActionResult GetAttendancesForGroup(int groupId)
  {
     //
  }

  [Route("api/groups/{groupId}/[controller]/{date}")]
  [HttpGet]
  public IActionResult GetAttendanceForGroup(int groupId,  DateTime date)
  {
     //
  }

  [Route("api/groups/{groupId}/[controller]")]
  [HttpPost]
  public IActionResult CreateAttendanceForGroup(int groupId, [FromBody] AttendanceCreateDto dto)
  {
     //
  }


  [Route("api/people/{personId}/[controller]")]
  [HttpGet]
  public IActionResult GetAttendancesForPerson(int personId)
  {
    //
  }

  [Route("api/groups/{groupId}/[controller]")]
  [HttpDelete("{id}")]
  public IActionResult Delete(int groupId, int id)
  {
     var group = _groupService.FindById(groupId);
     if (group == null)
        return NotFound();
     var attendance = _attendanceService.GetAttendanceByIdAndGroupId(id,groupId);
     if (attendance == null)
        return NotFound();

     _attendanceService.Delete(attendance);
     return NoContent();
  }
}

【问题讨论】:

  • 只是好奇,您是否尝试将删除路由更改为:Route("api/groups/{groupId}/[controller]/{id}")
  • @SivaGopal oo 这行得通,但我不明白为什么在这种情况下 [HttpDelete("{id}")] 被忽略

标签: c# asp.net-core asp.net-web-api-routing asp.net-core-webapi


【解决方案1】:

我不明白为什么在这种情况下 [HttpDelete("{id}")] 会被忽略。

您正在混合路线。

如下重构类。

将公共路由添加到控制器作为路由前缀,并利用路由约束

[Route("api/groups/{groupId}/[controller]")]
public class AttendancesController : Controller {
    public AttendancesController(IGroupService groupService, IAttendanceService attendanceService, IPersonService personService, IPersonAttendanceService personAttendanceService) {
        //
    }


    [HttpGet] // Matches GET api/groups/1/attendances
    public IActionResult GetAttendancesForGroup(int groupId) {
        //
    }


    [HttpGet("{date:datetime}")] //Matches GET api/groups/1/attendances/2017-05-27
    public IActionResult GetAttendanceForGroup(int groupId,  DateTime date) {
        //
    }

    [HttpPost] // Matches POST api/groups/1/attendances
    public IActionResult CreateAttendanceForGroup(int groupId, [FromBody] AttendanceCreateDto dto) {
        //
    }


    [HttpGet("~/api/people/{personId}/[controller]")] // Matches GET api/people/1/attendances
    public IActionResult GetAttendancesForPerson(int personId) {
        //
    }

    [HttpDelete("{id:int}")] // Matches DELETE api/groups/1/attendances/10
    public IActionResult Delete(int groupId, int id) {
        var group = _groupService.FindById(groupId);
        if (group == null)
            return NotFound();
        var attendance = _attendanceService.GetAttendanceByIdAndGroupId(id,groupId);
        if (attendance == null)
            return NotFound();

        _attendanceService.Delete(attendance);
        return NoContent();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 2012-09-15
    • 2012-11-22
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    相关资源
    最近更新 更多