asp.net core web api - тот же URL-адрес с другим параметром запроса

У меня есть класс контроллера, как показано ниже:

[Route("api/[controller]")]
public class ItemController : Controller
{
    //GET api/item?employId=1009
    [HttpGet]
    public List<ItemViewModel> GetByEmployId([FromQuery]long employId) {
            return new List<ItemViewModel>() {
                new ItemViewModel(),
                new ItemViewModel(),
                new ItemViewModel()
            };
    }

    // GET api/item?managerId=1009
    [HttpGet]
    public List<ItemViewModel> GetByManagerId([FromQuery]long managerId) {
        return new List<ItemViewModel>();
    }
}

Для первого URL (http://localhost/api/item?employId=1) веб-API может возвращать результаты. Но для второго URL (http://localhost/api/item?managerId=2) , веб-API возвращает ошибку с кодом HTTP 500. Может ли кто-нибудь помочь, почему это происходит? Спасибо.

По какой-то причине я не могу отладить проект веб-API.


person Yang You    schedule 30.01.2018    source источник
comment
Маршруты соответствуют только пути, а не запросу. Вы должны применить RESTful и представлять свои ресурсы через URL-адреса. то есть http://localhost/api/manager/2/item   -  person Tseng    schedule 30.01.2018
comment
Я согласен с Ценгом. Но при этом ваш код должен работать. HTTP 500 предполагает ошибку. Вы запускали отладчик, когда это произошло? Вы видели исключение? Кроме того, страница ошибки должна сообщить вам сообщение об ошибке.   -  person Gabriel Luci    schedule 30.01.2018
comment
@GabrielLuci прав. Код, который вы разместили здесь, не будет генерировать 500, поэтому единственное предположение состоит в том, что опубликованный вами код не является точным представлением кода, который вы на самом деле используете. Возможно, вы слишком много отредактировали. В любом случае, пожалуйста, создайте полный, минимальный и воспроизводимый образец. В настоящее время у вас этого нет.   -  person Chris Pratt    schedule 30.01.2018
comment
Привет @Tseng, спасибо за совет. На данный момент мы не можем изменить URL-адрес на стиль RESTful, потому что в ближайшем будущем крайний срок.   -  person Yang You    schedule 31.01.2018
comment
Привет @GabrielLuci, веб-API фактически размещен в Azure Service Fabric (хотя он размещен в локальном кластере), по какой-то причине каждый раз, когда я запускаю проект Service Fabric (который ссылается на проект веб-API) с помощью «Начать отладку» в Visual Studio , VS выдает сообщение об ошибке Произошла фатальная ошибка..... Мы знаем, что эта ошибка вызвана проектами, обновленными до .NET Core 2.0, но не знаем почему. Вот почему я упомянул, что не могу его отладить.   -  person Yang You    schedule 31.01.2018
comment
@ChrisPratt Да, вы правы. Я должен создать демонстрационный проект, чтобы протестировать его. Сегодня утром я создаю один, и он показывает «AmbiguousActionException: несколько совпадающих действий». '. Похоже, я не могу создать 2 веб-API с разными параметрами запроса, т.е. api/item?query1=123 и api/item?query2=456. Этим утром я только что понял, что веб-API, который мне нужен, выглядит примерно так: api/item?query1=123&query2=456, поэтому мне нужен только один метод в классе контроллера.   -  person Yang You    schedule 31.01.2018
comment
@ChrisPratt: неоднозначные маршруты также создают исключение при запуске / во время запроса IIRC, и оба метода действия имеют один и тот же сегмент пути, поскольку используются Uris в стиле WebAPI, а не в стиле MVC (с параметром [action])   -  person Tseng    schedule 31.01.2018
comment
И @yyou: Конечно, вы можете попытаться отложить это на более поздний срок, но изменение общедоступного API после выпуска — это боль в заднице, потому что это критическое изменение, которое сломает всех потребителей этого API. Вам лучше разобраться с этим, прежде чем выпускать свой продукт. Изменить маршруты довольно просто, просто пройдитесь по всем вашим контроллерам и измените их. Клиентам необходимо настроить свои URL-адреса, но если вы используете Swagger или любой другой генератор, вы сможете автоматически генерировать остальных клиентов из спецификаций swagger.   -  person Tseng    schedule 31.01.2018


Ответы (1)


Немного устарело, но если у кого-то такая же проблема, ответ можно найти здесь. Для этого вам просто нужно добавить параметры запросов в качестве параметров функции. Используя тот же пример.

[Route("api/[controller]")]
public class ItemController : Controller
{

    [HttpGet]
    [Route("")]
    public List<ItemViewModel> Get([FromQuery]long employId, [FromQuery] long managerId) {
            if(employId != null){
                    return new List<ItemViewModel>() {
                new ItemViewModel(),
                new ItemViewModel(),
                new ItemViewModel()
              };
             }
            if(managerId != null){

               return new List<ItemViewModel>();
           }

          return new List();

    }


}

person rubendmatos1985    schedule 22.03.2020
comment
Делая это таким образом, вы можете получить некоторые преимущества, и одно из них заключается в том, что вы можете установить некоторый приоритет для параметров запроса. - person rubendmatos1985; 22.03.2020