Базовые контроллеры ASP.NET атрибуты маршрутизации и абстрактные действия контроллеров - AmbiguousActionException - PullRequest
0 голосов
/ 26 ноября 2018

Я работаю над проектом ASP.NET Core Webapi.Я хотел бы реализовать некоторый базовый / абстрактный универсальный контроллер для всех методов, которые являются общими для каждого контроллера (например, методы CRUD), и наследовать этот контроллер во всех других контроллерах.Ниже приведен пример кода:

public abstract class BaseApiController : Controller 
{
    [HttpGet]
    [Route("")]
    public virtual IActionResult GetAll() 
    {
        ...
    }

    [HttpGet]
    [Route("{id}")]
    public virtual IActionResult GetById(int id)
    {
        ...
    }

    [HttpPost]
    [Route("")]
    public virtual IActionResult Insert(myModel model)
    {
        ...
    }
}


[Route("api/Student")]
public class StudentController : BaseApiController 
{
    // Inherited endpoints:
    // GetAll method is available on api/Student [GET]
    // GetById method is available on api/Student/{id} [GET]
    // Insert method is available on api/Student [POST]
    //
    // Additional endpoints:
    // ShowNotes is available on api/Student/{id}/ShowNotes [GET]
    [HttpGet]
    [Route("{id}/ShowNotes")]
    public virtual IActionResult ShowNotes(int id) 
    {
        ...
    }
}

[Route("api/Teacher")]
public class TeacherController : BaseApiController 
{
    // Inherited endpoints:
    // GetAll method is available on api/Teacher [GET]
    // GetById method is available on api/Teacher/{id} [GET]
    // Insert method is available on api/Teacher [POST]
    //
    // Additional endpoints:
    // ShowHours is available on api/Teacher/{id}/ShowHours [GET]
    [HttpGet]
    [Route("{id}/ShowHours")]
    public virtual IActionResult ShowHours(int id) 
    {
        ...
    }
}

Я видел такое решение в .NET Framework WebApi с дополнительным настраиваемым RouteProvider, например:

public class WebApiCustomDirectRouteProvider : DefaultDirectRouteProvider
{
    protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
    {
        return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(inherit: true);
    }
}

Каждый раз, когда я пытаюсь достичьКонечная точка в производном контроллере Я получил AmbiguousActionException:

Multiple actions matched. The following actions matched route data and had all constraints satisfied:
XXX.WebApi.Controllers.CommonAppData.TeacherController.GetById
XXX.WebApi.Controllers.CommonAppData.StudentController.GetById

Можно ли создать такой базовый контроллер в .NET Core WebApi?Как я должен написать это, чтобы достигнуть Методы Действия, не объявляя это явно в производном Контроллере?Как мне настроить такое решение?Любая дополнительная конфигурация в классе запуска?

...