I'm relatively new to the MVC framework but I do have a functioning Web Project with an API controller that utilizes AttributeRouting (NuGet package) - however, I'm starting another project and it just does not want to follow the routes I put in place.
Controller:
public class BlazrController : ApiController { private readonly BlazrDBContext dbContext = null; private readonly IAuthProvider authProvider = null; public const String HEADER_APIKEY = "apikey"; public const String HEADER_USERNAME = "username"; private Boolean CheckSession() { IEnumerable<String> tmp = null; List<String> apiKey = null; List<String> userName = null; if (!Request.Headers.TryGetValues(HEADER_APIKEY, out tmp)) return false; apiKey = tmp.ToList(); if (!Request.Headers.TryGetValues(HEADER_USERNAME, out tmp)) return false; userName = tmp.ToList(); for (int i = 0; i < Math.Min(apiKey.Count(), userName.Count()); i++) if (!authProvider.IsValidKey(userName[i], apiKey[i])) return false; return true; } public BlazrController(BlazrDBContext db, IAuthProvider auth) { dbContext = db; authProvider = auth; } [GET("/api/q/users")] public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } [GET("api/q/usersauth")] public string GetAuth() { if (!CheckSession()) return "You are not authorized"; return "You are authorized"; } }
AttributeRoutingConfig.cs
public static class AttributeRoutingConfig { public static void RegisterRoutes(RouteCollection routes) { // See http://github.com/mccalltd/AttributeRouting/wiki for more options. // To debug routes locally using the built in ASP.NET development server, go to /routes.axd routes.MapAttributeRoutes(); } public static void Start() { RegisterRoutes(RouteTable.Routes); } }
Global.asax.cs:
// Note: For instructions on enabling IIS6 or IIS7 classic mode, // visit http://go.microsoft.com/?LinkId=9394801
public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } }
When I try to navigate to /api/q/users - I get a 404 not found error. If I change the routes to be "/api/blazr/users" - I get an error about multiple actions and not being able to determine which action to take.
Any help is appreciated - I really just need a small nudge to figure out where the issue is, no need to solve it completely for me (I need to learn!)
Thanks
EDIT
routes.axd:
api/{controller}/{id} {resource}.axd/{*pathInfo} {controller}/{action}/{id}
To enable Attribute Routing, we need to call the MapMvcAttributeRoutes method of the route collection class during configuration. We can also add a customized route within the same method. In this way we can combine Attribute Routing and convention-based routing. A route attribute is defined on top of an action method.
MVC 5 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 application. The earlier style of routing, called convention-based routing, is still fully supported.
Note: Attribute Routing is configuring before the Convention Routing or simple Routing. We can use Convention based Routing and Attribute Routing in the same project. Be sure attribute routing should be defined first to convention based routing.
MapMvcAttributeRoutes(RouteCollection, IDirectRouteProvider) Maps the attribute-defined routes for the application. MapMvcAttributeRoutes(RouteCollection, IInlineConstraintResolver) Maps the attribute-defined routes for the application.
Not only do you have to have the call to routes.MapMvcAttributeRoutes()
in your App_Start\RouteConfig.cs
file, it must appear before defining your default route! I add it before that and after ignoring {resource}.axd{*pathInfo}
. Just found that out trying to get attribute routing to work correctly with my MVC 5 website.
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapMvcAttributeRoutes(); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Account", action = "Index", id = UrlParameter.Optional } ); }
In your App_Start/RoutesConfig.cs
make sure you call the following line of code:
routes.MapMvcAttributeRoutes();
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