Я играю с идеей иметь базовый контроллер, который использует общий репозиторий для предоставления базовых методов CRUD для моих контроллеров API, чтобы мне не приходилось дублировать один и тот же базовый код в каждом новом контроллере. Но у меня возникают проблемы с распознаванием атрибута маршрутизации, когда он находится в базовом контроллере. Чтобы точно показать, в чем заключается проблема, я создал действительно простой контроллер WebAPI.
 Когда у меня есть метод Get в главном контроллере, и он наследуется от ApiController напрямую, у меня нет проблем, и это работает, как и ожидалось.
[RoutePrefix("admin/test")]
public class TestController : ApiController
{
    [Route("{id:int:min(1)}")]
    public string Get(int id)
    {
        return "Success";
    }
}
  Когда я перемещаю метод Get в базовый контроллер, он возвращает содержимое страницы 404.
[RoutePrefix("admin/test")]
public class TestController : TestBaseController
{
}
public class TestBaseController : ApiController
{
    [Route("{id:int:min(1)}")]
    public string Get(int id)
    {
        return "Success";
    }
}
 Еще несколько интересных заметок:
-  
Я могу получить доступ к действию в
GET/Test/1. Так что он все еще находит его на основе маршрута по умолчанию. -  
Когда я пытаюсь получить доступ к
POST/admin/test, он возвращает следующий JSON{"Message": "Не найден ресурс HTTP, соответствующий URI запроса" http://test.com/admin/test ".", "MessageDetail": "Не найден тип, соответствующий контроллеру с именем 'admin'. " }
 
Кто-нибудь знает способ заставить маршрутизацию работать с атрибутами из базового контроллера?