How to understand the routing in ASP.Net Web API

Someone asked on Stack Overflow:

I am trying to learn ASP.Net Web API. And I have a MVC controller Home and from there I want to make a call to API Controller which is CoursesController via ajax call. But I am not able to make the ajax call to the api controller when I give the complete valid path.

Case 1: Working example: If I go to localhost:port/

q. HomeController’s Index mathod gets hit

b. Then CoursesApiController gets hit and result is displayed

Case 2: Non Working Example: If I go to localhost:port/Home/Index

a. HomeController’s Index method gets hit

b. But ApiController does not get hit

Chrome Dev error:

It tries to attempt to open API URI pointing at localhost:port/Home/api/Courses (which obviously is wrong).

But why does it work fine when I don’t explicitly tell the URL in browser?

Routes.Config File:

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

WebApi.config File:

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

Index.cshtml File:

<div >
    hello worl
    <ol id="courses"></ol>
</div>
@section scripts
{
    <script>
        $.ajax({
            url: 'api/courses', // here I am making the API Call to Courses controller
            success: function (courses) {
                debugger;
                var list = $('#courses');
                for (var i = 0; i < courses.length; i++)
                {
                    var course = courses[i];
                    list.append('<li>' + course.title + '</li>');
                }
            }
        });
    </script>
}

I posted the following answer, which was chosen as the accepted answer and received 2 upvotes:

You have a bug/typo in your url in the javascript.

You have: url: 'api/courses',

Should be: url: '/api/courses',

This is due to how the browser handles relative paths.

If your browser is sitting at http://localhost:port/ the script will work since the relative path is correct. Once you manually route to /home or /home/index the relative path is now pointing to /home/index/api which isn’t what you want.

Ultimately a javascript path fragment that does not start with a ’/’ is treated as relative to the current browser path. A path that starts with a ’/’ is treated as an absolute path.


Originally posted on Stack Overflow — 2 upvotes (accepted answer). Licensed under CC BY-SA.

signed letter b

Dad. Geek. Gamer. Software developer. Cloud user. Old Car enthusiast.  Blogger.


Top Posts


profile for Nate on Stack Exchange, a network of free, community-driven Q&A sites
a proud member of the blue team of 512KB club
Thoughts, opinions, and ideas shared here are my own. © 2026 Nate Bross.