Я переношу веб-приложение ASP.NET MVC (.NET Framework) в ASP.NET MVC Core 3.1. Это приложение является внутренним для компании. Мы пользуемся возможностью, чтобы очистить некоторые маршруты API, чтобы сделать их более RESTful, например: /api/Values?id=1
→ /api/Values/1
. Однако не все наши другие приложения смогут внести соответствующие изменения в то время, когда это приложение будет запущено в производство, поэтому мы хотим иметь возможность поддерживать оба формата URL-адресов одновременно. Это возможно? Моя настройка маршрутизации выглядит так:
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.Select().Expand().Filter().OrderBy().Count().MaxTop(null);
endpoints.EnableDependencyInjection();
endpoints.MapODataRoute("ODataRoute", "odata", GetEdmModel());
});
Мой контроллер выглядит так:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : Controller
{
// constructor and dependency injection omitted
[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> Get(int id)
{
// method logic omitted
}
}
С приведенным выше кодом /api/Values/1
работает нормально, но строка запроса ?id=1
приводит к ошибке 404. Если я изменю атрибут только на [HttpGet]
, строка запроса будет работать, а версия RESTful — нет. Вот что я пробовал до сих пор:
[HttpGet("{id}")]
+[FromQuery]
— REST: 404, QS: 405 (метод не разрешен)[HttpGet]
+[FromQuery] [FromRoute]
— ОТДЫХ: 404, QS: 200- только
[HttpGet("{id?}")]
— REST: 200, QS: 404
Возможно ли это сделать? Спасибо.