I've got a few methods, which I want to follow a specific pattern for their URLs.
Basically there's restaurants, which have IDs, and a collection of Terminals under them.
I'm trying to get the following sort of pattern to emerge: api/Restaurant - get all Restaurants api/Restaurant/Bobs - gets the restaurant with the ID of Bobs api/Restaurant/Bobs/terminals - get all terminals in bobs restaurant api/Restaurant/bobs/terminals/second - get the terminal with the ID of second in the restaurant bob
I've got the methods to do this, and I've assigned the Route attribute to each as follows:
[HttpGet]
public IEnumerable<IRestaurant> Get()
{
//do stuff, return all
}
[HttpGet]
[Route("api/Restaurant/{restuarantName}")]
public IRestaurant Get(string restaurantName)
{
//do stuff
}
[HttpGet]
[Route("api/restuarant/{restaurantName}/terminals")]
public IEnumerable<IMiseTerminalDevice> GetDevices(string restaurantName)
{
//do stuff
}
[HttpGet]
[Route("api/restaurant/{restaurantName}/terminals/{terminalName}")]
public IMiseTerminalDevice GetDeviceByName(string restaurantName, string terminalName)
{
//do stuff
}
However only my basic GET (api/Restaurant) is working. My WebAPI config is the default, and reads
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
Anybody know where I'm going wrong? All other methods return routing mismatch (restaurant with ID) or a 404.
Thanks in advance!
and reads config.MapHttpAttributeRoutes();?...are you callingconfig.MapHttpAttributeRoutes()because this is the one which probes controllers and registers attribute routes in the route table...also note that requests matching conventional routing will never match controllers/actions decorated with attribute routes..