f470071
f470071

Reputation: 1567

How to use string "api" in ASP.NET MVC request URL?

By testing and wasting obscene amount of time I have found out that ASP.NET MVC has a bug which prevents using the string "api" in request URL. I wan to access my method with URL like this

www.mysite.com/api/test

This is not an unexpected wish. In fact it an an obvious Url choice.

Is there a workaround to achieve this?

UPDATE

By request routing definition.

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

    // this executes, checked it in debugger
    routes.MapRoute(
        name: "Test",
        url: "api/test",
        defaults: new { controller = "Api", action = "Test" }
    );
}

ApiController

public class ApiController : Controller
{
    public ActionResult Test()
    {
        return Content("TEST TEST TEST");
    }

{

Upvotes: 2

Views: 170

Answers (1)

Tieson T.
Tieson T.

Reputation: 21191

If you have the WebApi packages installed, you'll find a WebApiConfig.cs class in App_Start. Here's what it looks like:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

So, assuming you don't change the default code in Global.asax.cs, this route gets added to the routing table. Hence, why your /api/whatever route doesn't work.

If you're not using WebApi, I would suggest removing the packages. Otherwise, you can simply change the "root" part of the API route to something else:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            /* changed 'api' to 'restsvc' */
            routeTemplate: "restsvc/{controller}/{id}", 
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

Upvotes: 2

Related Questions