Search code examples
c#asp.net-web-apiasp.net-web-api-routing

Attribute Routing and CreatedAtRoute


I am trying to convert my Web Api project to use attribute routing. One thing I am not understanding is the CreatedAtRoute method for a POST request. In my WebApiConfig.cs I used to have a

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/account/{accountId}/site/{siteId}/visitor/{visitorId}/session/{sessionId}/{controller}/{action}",
            defaults: new { action = RouteParameter.Optional }
        );

I commented this out thinking it was no longer needed, but CreatedAtRoute wants the name of the route and cant find it. So how is that handled with attribute routing?


Solution

  • Ok...this was easy once you see whats going on. In attribute routing you have to specify the Name of the route to retrieve the resource. So on my GET action it looks like this:

    [Route("{sessionId}",Name="GetSession")]
        [ResponseType(typeof(Session))]
        public async Task<IHttpActionResult> Get(HttpRequestMessage request, int accountId, int siteId, Guid visitorId, Guid sessionId)
    

    And then in the POST action change the CreatedAtRoute from:

    return CreatedAtRoute("DefaultApi", new
            {
               controller: "session"
                visitorId = session.VisitorId,
                sessionId = session.SessionId
            }, session);
    

    To this:

    return CreatedAtRoute("GetSession", new
            {
                visitorId = session.VisitorId,
                sessionId = session.SessionId
            }, session);