Web API Attribute routing in Sitecore 8.1 not working

1k views Asked by At

As Atrribute routing does not work in sitecore 8.1 out of the box, I am following https://github.com/Krusen/Sitecore.WebApi
And got the uget package for Krusen.Sitecore.WebApi.Custom.

This is my ConfigureWebApi class

public class ConfigureWebApi
{
    public void Process(PipelineArgs args)
    {

        GlobalConfiguration.Configure(config => config.Routes.MapHttpRoute(
                name: "myApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            ));
        GlobalConfiguration.Configure(config => config.MapHttpAttributeRoutes());
        GlobalConfiguration.Configure(ReplaceControllerSelector);
    }

    private static void ReplaceControllerSelector(HttpConfiguration config)
    {
        config.Services.Replace(typeof (IHttpControllerSelector),
            new CustomHttpControllerSelector(config, new NamespaceQualifiedUniqueNameGenerator()));
    }
}

And this is my controller

[RoutePrefix("windows")]
public class WmsController : ApiController
{
    [HttpGet]
    [Route("hi")]
    public IHttpActionResult Hello()
    {
        return Ok("Welcome to my Api.");
    }

}

When I call this:

http://my.api.local/api/wms/hello

works.
But when I call

http://my.api.local/api/windows/hi

does not work. It says 404.

Am I missing something !!

2

There are 2 answers

0
Nkosi On BEST ANSWER

The second call is not working because Attribute routing must be configured before Convention-based routes to avoid route conflicts.

public void Process(PipelineArgs args) {
    GlobalConfiguration.Configure(config => {
        // Map Attribute Routes
        config.MapHttpAttributeRoutes();

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

        // Replace IHttpControllerSelector with our custom implementation
        ReplaceControllerSelector(config);
    });
}

Which I also believe is how it was shown in the documentation in the linked repo

Secondly based on the RoutePrefix("window") and Route("hi") in the ApiController the mapped attribute route would be mapped as

http://my.api.local/windows/hi 

To get http://my.api.local/api/windows/hi to map to the desired action you would need to update the route prefix as already explained in one of the other answers.

0
Ahmed Okour On

You need to add "api/" into your controller attribute routing

[RoutePrefix("api/windows")]
public class WmsController : ApiController
{
    [HttpGet]
    [Route("hi")]
    public IHttpActionResult Hello()
    {
        return Ok("Welcome to my Api.");
    }

}