1

I am getting the error - Multiple controller types were found that match the URL.

On my mobile API, I have to support multiple versions.. All are mixed into a single controller with overriding route attributes.

My code is like this (working with no issues)

namespace MyApi 
{
    [RoutePrefix("company")]
    public class UseController
    {
        [Route("users")]
        public List<user> GetUsers() { return new List<User>(); }

        [Route("~/v2/company/users")]
        public List<user> GetUsers_v2() { return new List<User>(); }

        [Route("~/v3/company/users")]
        public List<user> GetUsers_v3() { return new List<User>(); }
    }
}

As the controller is growing, its getting hard to maintain. I want to split the versions into diff controllers, like

namespace MyApi 
{
    [RoutePrefix("company")]
    public class UseController
    {
        [Route("users")]
        public List<user> GetUsers() { return new List<User>(); }
    }
}

namespace MyApi.v2
{
    [RoutePrefix("v2/company")]
    public class UseController
    {
        [Route("users")]
        public List<user> GetUsers() { return new List<User>(); }
    }
}

namespace MyApi.v3
{
    [RoutePrefix("v3/company")]
    public class UseController
    {
        [Route("users")]
        public List<user> GetUsers() { return new List<User>(); }
    }
}
DHAR
  • 63
  • 11
  • https://stackoverflow.com/questions/27933731/ambiguous-controller-names-with-routing-attributes-controllers-with-same-name-a – DHAR Mar 11 '19 at 17:42

2 Answers2

0

API versioning is need when you need to support backward compatibility. Try to use nuget package for your APIs versioning.

Nuget:Microsoft.AspNet.WebApi.Versioning

GitHub: aspnet-api-versioning

Aniket
  • 110
  • 1
  • 12
0
[RoutePrefix("api/v2/company")]
public class UseV2Controller : ApiController
{
    [Route("users")]
    public List<user> GetUsers_v2() { return new List<user>(){new user(){ Name ="v2User"} }; }
}

[RoutePrefix("api/v3/company")]
public class UseV3Controller : ApiController
{
    [Route("users")]
    public List<user> GetUsers_v3() { return new List<user>() { new user() { Name = "v3User" } }; }

}

public class user
{
    public string Name { get; set; }
}

I changed your controller name to UseV2Controller instead of UseControllerV2, same with the v3. Then added route prefix api/v2/company and api/v3/company

ChizT
  • 677
  • 3
  • 10
  • I edited my new code.. want to go with diff namespace for each version. versions of resources (users, employees etc) will be classified into their namespace with same controller name.. that way the controller & routes are clean – DHAR Mar 10 '19 at 03:43