Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC Attribute Routing Not Working

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} 
like image 841
Teagan42 Avatar asked Jun 05 '13 16:06

Teagan42


People also ask

Can you enable attribute routing in MVC?

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.

What is attribute routing in MVC?

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.

Is conventional routing and attribute routing can work together?

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.

What is MapMvcAttributeRoutes?

MapMvcAttributeRoutes(RouteCollection, IDirectRouteProvider) Maps the attribute-defined routes for the application. MapMvcAttributeRoutes(RouteCollection, IInlineConstraintResolver) Maps the attribute-defined routes for the application.


2 Answers

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 }         );      } 
like image 84
Derreck Dean Avatar answered Sep 25 '22 18:09

Derreck Dean


In your App_Start/RoutesConfig.cs

make sure you call the following line of code:

  routes.MapMvcAttributeRoutes(); 
like image 37
David McEleney Avatar answered Sep 21 '22 18:09

David McEleney