CreatedAtRoute routing to different controller

Late to the party but an alternative answer. If the action you are routing to also uses attribute routing, you can give the route a name and pass that in to the CreatedAtRoute method. This is done by setting a Name property on the Route. Following your post example, consider the following action.

// GET: api/Messages/5
[Route("api/messages/{id}", Name="GetMessage")]
public async Task<IHttpActionResult> GetMessage(int id)
{
    // get the message
}

Note that the Name property on the route attribute, [Route("api/messages/{id}", Name="GetMessage")], is set to "GetMessage". By doing this we can call the CreatedAtRoute method from the PostChannelMessage action and pass in the route name like so:

return CreatedAtRoute("GetMessage", new { id = message.Id }, message);

This is a scenario I encountered and my searching led here so thought I would post this alternative answer in case it helps anyone else.


Oh dear, this may be a new record for answering my own question.

return CreatedAtRoute("DefaultApi", new { controller = "messages", id = message.Id }, message);

does the trick. i.e. explicitly specifying the controller. I worked this our by seeing that the exception was related to the UrlHelper and reading its docs...