Search code examples
asp.netasp.net-web-apiasp.net-core-2.1

ASP.NET Core 2.1 CreatedAtRoute Returns no Response


I was searching around but I couldn't find a working answer for my issue. I saw a similar question but we had different results. My issue is I have 2 controllers. The first controller has a POST action that I want to return a CreatedAtRoute to a GET action inside a different controller. I tested the GET action in Postman and it works so my only issue is getting the CreatedAtRoute to work.

My first controller:

[HttpPost]
public async Task<IActionResult> Submit(AssessmentAttemptVM attempt)
{
    if (!ModelState.IsValid)
    {
        return BadRequest();
    }
    //Do database related stuff
    await _context.SaveChangesAsync();
    return CreatedAtRoute("GetAssessmentResult", new { id = studentAttempt.Id }, studentAttempt);
}

My second controller:

[HttpGet("{id}", Name = "GetAssessmentResult")]
public async Task<ActionResult<AssessmentResultVM>> GetById(int id)
{
    //Get my ViewModel -- This works if I try to access it without using the CreatedAtRoute method
    return resultVM;
}

The picture below shows what Postman responds with when I try to Post. I verified that the data gets added to the database so only the CreatedAtRoute method is the only I can think of that isn't making this work for me.. This is what Postman shows me when I try to post.

EDIT

Controller Route Attributes:

[ApiController]
    [Route("api/view/assessmentresult/")]
    public class AssessmentResultsController: ControllerBase
    {

[ApiController]
    [Route("api/take/assessment")]
    public class StudentAssessmentController : ControllerBase
    {

Solution

  • I found the cause. The last parameter for CreatedAtRoute and CreatedAtAction required an object similar to the destination controller. It went over my head because I was sending models prior to what I did now which used a ViewModel.

    Well That wasn't the main reason I couldn't get a response though. It was because of an execption where the object I'm passing ended up having recursive references because I was sending a model that wasn't properly formatted to be sent over as JSON.

    I used this to make it work, taken from the MS Docs site: CreatedAtAction(String, String, Object, Object) Where the last parameter should be the object you want to the api to send over.

    PS: I also didn't notice immediately because when I debugged the project, it didn't crash and had to read the logs. I'm a noob so I really didn't know that it's possible for an exception to occur without the project crashing in debug mode.