Как перегрузить методы контроллера с одинаковым количеством аргументов в ASP.NET Core Web API? - PullRequest
1 голос
/ 08 апреля 2019

Я перевожу полный проект REST .NET Framework Web API 2 в ASP.NET Core 2.2 и немного теряюсь в маршрутизации.

В Web API 2 мне удалось перегрузить маршруты с одинаковым количеством параметров в зависимости от типа параметра, например, Я мог бы иметь Customer.Get(int ContactId) и Customer.Get(DateTime includeCustomersCreatedSince), и входящие запросы были бы соответственно направлены.

Мне не удалось добиться того же в .NET Core, я либо получаю ошибку 405 или 404, и вместо этого эта ошибка:

"{\" error \ ": \" Запрос соответствует нескольким конечным точкам. Совпадения: \ r \ n \ r \ n [AssemblyName] .Controllers.CustomerController.Get ([AssemblyName]) \ r \ n [AssemblyName] .Controllers.CustomerController.Get ([AssemblyName]) \ "}"

Это был рабочий код в моем полном приложении .NET Framework Web API 2:

[RequireHttps]    
public class CustomerController : ApiController
{
    [HttpGet]
    [ResponseType(typeof(CustomerForWeb))]
    public async Task<IHttpActionResult> Get(int contactId)
    {
       // some code
    }

    [HttpGet]
    [ResponseType(typeof(List<CustomerForWeb>))]
    public async Task<IHttpActionResult> Get(DateTime includeCustomersCreatedSince)
    {
        // some other code
    }
}

И это то, к чему я преобразовал это в Core 2.2:

[Produces("application/json")]
[RequireHttps]
[Route("api/[controller]")]
[ApiController]
public class CustomerController : Controller
{
    public async Task<ActionResult<CustomerForWeb>> Get([FromQuery] int contactId)
    {
        // some code
    }

    public async Task<ActionResult<List<CustomerForWeb>>> Get([FromQuery] DateTime includeCustomersCreatedSince)
    {
        // some code
    }
}

Приведенный выше код работает, если я закомментирую один из Get методов, но завершается неудачей, как только у меня есть два Get метода. Я ожидал, что FromQuery будет использовать имя параметра в запросе для управления маршрутизацией, но это не так?

Можно ли перегрузить метод контроллера, подобный этому, когда у вас одинаковое количество параметров и маршрут, основанный на типе параметра или имени параметра?

1 Ответ

2 голосов
/ 08 апреля 2019

Вы не можете выполнять перегрузки действий.Маршрутизация работает в ASP.NET Core иная, чем в ASP.NET Web Api.Тем не менее, вы можете просто объединить эти действия и затем перейти внутрь, так как все параметры являются необязательными:

public async Task<ActionResult<CustomerForWeb>> Get(int contactId, DateTime includeCustomersCreatedSince)
{
    if (contactId != default)
    {
        ...
    }
    else if (includedCustomersCreatedSince != default)
    {
        ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...