Маршруты веб-API .NET Core и запрос GET

У меня есть следующий контроллер (приложение .NET Core Web API) (Source содержит несколько Site)

SitesController.cs

// GET: api/sites
[HttpGet]
public IDictionary<int, Site> GetSites() {
    return _db.Sites.ToDictionary(s => s.SiteId, s => s);
}

// GET: api/sites?source=5
[HttpGet("{source}")]
public IDictionary<int, Site> GetSites([FromRoute] int source) {
    return _db.Sites.Where(s => s.SourceId == source).ToDictionary(s => s.SiteId, s => s);
}

// GET: api/sites/5
[HttpGet("{id}")]
public async Task<IActionResult> GetSite([FromRoute] int id) {

Когда клиент Угловой запрашивает Site только у Source, я, однако, получаю все сайты, функция с параметром int source не вызывается ... Почему?

findAllSourceSites(sourceId: number): Observable<Site[]> {
    return this.http.get(`${this.API_URL}/api/sites`, {
        params: new HttpParams()
            .set('source', sourceId.toString())
    }).pipe(
        map(res => {
            return Object.values(res);
        })
    );
}

Маршруты веб-API .NET Core и запрос GET

sourceId пуст? пожалуйста, поделитесь суфиксом URL-адреса (api / ...), который вы вызываете api с

Marcus Höglund 09.11.2018 18:46

@ MarcusHöglund, пожалуйста, посмотрите комментарии ответа пенлейхана

serge 09.11.2018 19:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
530
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Совершенно уверен, что это из-за [FromRoute], чтобы он работал, ваш URL-адрес должен быть /api/sites/1, HttpParams устанавливает строку запроса, которая теперь ваш URL-адрес выглядит как /api/sites?source=1

Если вы хотите использовать строку запроса, вам следует сменить контроллер на [FromQuery].

Обновлено: Из-за AmbiguousActionException: Multiple actions matched. альтернативное решение сочетало бы оба вместе.

[HttpGet] 
public IDictionary<int, Site> GetSites([FromQuery] int? source) {
    if (source.HasValue) {
        // get specific 
    } else {
        // get all
    }
}

@Serge А забыл упомянуть, что теперь это должен быть просто [HttpGet], без {source}

penleychan 09.11.2018 19:00

теперь достигается любая точка останова ... AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied: LoggerApi.Controllers.SitesController.GetSites (LoggerApi) LoggerApi.Controllers.SitesController.GetSites (LoggerApi)

serge 09.11.2018 19:03

Однако этого не должно быть, если он обнаружит, что у него есть строка запроса, он будет использовать GetSites(int source), иначе GetSites()

penleychan 09.11.2018 19:07

Интересно, почти наверняка это никогда не было проблемой с WebAPI2. Альтернативное решение вы можете сделать [HttpGet] public IDictionary<int, Site> GetSites([FromQuery] int? source), и для вашей логики вы должны проверить, содержит ли source значение, сделать что-то еще, получить все.

penleychan 09.11.2018 19:25

да ... последний комментарий был действительно полезен, и он сработал. Однако я действительно не понимаю, почему два отдельных метода не имеют одинакового эффекта ...

serge 12.11.2018 10:36

пожалуйста, обновите свой ответ, указав информацию о последнем комментарии, чтобы я мог отметить его как ответ

serge 12.11.2018 11:53

Другие вопросы по теме