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?
CreatedAtRoute (object routeValues, object value)By default, if no information about target route is passed, it will take the path of the current method and use it for creating Location header. In the following example it takes the route of POST method and attaches all route values as query parameters.
As per our opinion, Attribute Routing provides us more flexibilities as compared to Convention Based Routing. In Attribute Routing, we can manage route as controller level, action level and also area level. Also, it can override the child route, if required.
Routing is how Web API matches a URI to an action. Web API 2 supports a new type of routing, called attribute routing. As the name implies, attribute routing uses attributes to define routes. Attribute routing gives you more control over the URIs in your web API.
ASP.NET Core API. With attribute-based routing, we can use C# attributes on our controller classes and on the methods internally in these classes. These attributes have metadata that tell ASP.NET Core when to call a specific controller. It is an alternative to convention-based routing.
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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With