У меня есть следующий контроллер (приложение .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);
})
);
}
@ MarcusHöglund, пожалуйста, посмотрите комментарии ответа пенлейхана



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Совершенно уверен, что это из-за [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}
теперь достигается любая точка останова ... 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)
Однако этого не должно быть, если он обнаружит, что у него есть строка запроса, он будет использовать GetSites(int source), иначе GetSites()
Интересно, почти наверняка это никогда не было проблемой с WebAPI2. Альтернативное решение вы можете сделать [HttpGet] public IDictionary<int, Site> GetSites([FromQuery] int? source), и для вашей логики вы должны проверить, содержит ли source значение, сделать что-то еще, получить все.
да ... последний комментарий был действительно полезен, и он сработал. Однако я действительно не понимаю, почему два отдельных метода не имеют одинакового эффекта ...
пожалуйста, обновите свой ответ, указав информацию о последнем комментарии, чтобы я мог отметить его как ответ
sourceId пуст? пожалуйста, поделитесь суфиксом URL-адреса (api / ...), который вы вызываете api с