user1352057
user1352057

Reputation: 3182

How to correctly configure a route issue in ASP.Net WebApi

After developing a simple test ASP.Net WebApi solution to implement Unity interface DI into my Controller I have hit an issue with getting my API to route to the relevant methods correctly.

Typing in the following URL will return the first GET method as expected:

http://localhost:1035/api/values

Typing in a parameter to hit the GetSelectedPerson method in the controller is never registered:

http://localhost:1035/api/values/Test

Hopefully someone can tell me where I'm going wrong, heres the relevant code.

RouteConfig from the App_Start folder:

public class RouteConfig
{
    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 }
        );
    }
}

Here is the WebApi config again from the App_Start folder:

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

        config.Formatters.Remove(config.Formatters.XmlFormatter);
    }
}

Here are the two GET HTTP methods I've implemented within the 'Values' controller:

public class ValuesController : ApiController
{

    private IPersonCreator _createPerson;

    public ValuesController(IPersonCreator createPerson)
    {
        _createPerson = createPerson;
    }

    //GET api/values
    public IPerson Get()
    {
        return _createPerson.CreateNewPerson();
    }

    //**********Issue: This Method is never hit.**********
    public IPerson GetSelectedPerson(string nameOfPerson)
    {
        IPerson selectedPerson = null;

        var returnedPeople = _createPerson.CreateNewPeople();

        foreach (var person in returnedPeople)
        {
            if (person.Name == "John")
            {
                selectedPerson = person;
            }
        }

        return selectedPerson;
    }

Upvotes: 1

Views: 197

Answers (1)

James
James

Reputation: 82096

This is a parameter binding problem. In the default route the expected parameter name is id, however, in your action you have nameOfPerson.

You have two options here, you can either rename your nameOfPerson parameter to be id i.e.

public IPerson GetSelectedPerson(string id) 

or alternatively add a specific route which expects a nameOfPerson parameter i.e.

// place after default route
config.Routes.MapHttpRoute(
    name: "PersonByNameApi",
    routeTemplate: "api/{controller}/{nameOfPerson}",
    defaults: new
    {
        nameOfPerson = RouteParameter.Optional
    }
);

Upvotes: 1

Related Questions