public static
public static

Reputation: 13000

Why isn't my ASP.NET API route being called, is my URL not correct?

I have a new ASP.NET MVC 5 application. I added an /api folder in my controllers folder and added a MVC2 API controller.

My global.asax has:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }

My controller looks like:

public class UsersController : ApiController
{

    [HttpGet]
    [ActionName("User")] 
    public IToken GetUser()
    {
        return new User();
    }
}

Now I get a 404 resource cannot be found error when I go to:

http://localhost:53323/api/users/user
http://localhost:53323/api/users/getuser

What could the problem be?

Update

My MVC route config:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    } 

My API route config:

        config.MapHttpAttributeRoutes();

        //config.Routes.MapHttpRoute(
        //    name: "DefaultApi",
        //    routeTemplate: "api/{controller}/{id}",
        //    defaults: new { id = RouteParameter.Optional }
        //);

        config.Routes.MapHttpRoute(
            name: "ActionApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

Upvotes: 0

Views: 491

Answers (2)

Lukas G
Lukas G

Reputation: 680

Seems like you are missing correct registration in your Application_Start().

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    WebApiConfig.Register(GlobalConfiguration.Configuration); // This should be above the default route registration.

    RouteConfig.RegisterRoutes(RouteTable.Routes);
    //GlobalConfiguration.Configure(WebApiConfig.Register); // Remove this line.
}

Upvotes: 1

Colin Bacon
Colin Bacon

Reputation: 15619

Try using attribute routing on your controller and action methods.

Example

[RoutePrefix("api/users")]
public class UsersController : ApiController
{

    [HttpGet]
    [Route("user")]
    public IToken GetUser()
    {
        return new User();
    }
}

Upvotes: 0

Related Questions