Reputation: 6877
When defining a RoutePrefix at controller level, when I try to access the API class using the URL with prefix http://localhost:55020/api/v2/dummy/get
it throws 404. This http://localhost:55020/api/dummy/get
works absolutely fine though.
Here is controller class which has a RoutePrefix defined
[RoutePrefix("v2/dummy")]
public class DummyController : ApiController
{
// GET api/values
[SwaggerOperation("Get")]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2", "value3" };
}
}
Here is WebApiConfig
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
Upvotes: 9
Views: 16040
Reputation: 7352
Use attribute routing instead
public class DummyController : ApiController
{
// GET api/values
[HttpGet]
[Route("api/v2/dummy/get")]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2", "value3" };
}
}
and if you want route prefix then
[RoutePrefix("api/v2/dummy")]
public class DummyController : ApiController
{
// GET api/v2/dummy
[HttpGet]
[Route("get")]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2", "value3" };
}
}
Upvotes: 10
Reputation: 246998
You are mixing up how attribute routing and convention-based routing work.
This is full attribute routing.
[RoutePrefix("api/v2/dummy")]
public class DummyController : ApiController
{
// GET api/v2/dummy/get
[HttpGet]
[Route("get")]
[SwaggerOperation("Get")]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2", "value3" };
}
}
If you want to do the same thing via convention-based routing
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DummyApi",
routeTemplate: "api/v2/dummy/{action}",
defaults: new { controller = "Dummy" }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
Upvotes: 5