WedX - журнал о программировании и компьютерных науках

Привязка параметра к маршруту или строке запроса в ASP.NET MVC Core

Я переношу веб-приложение 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

Возможно ли это сделать? Спасибо.


Ответы:


1

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

[HttpGet]
[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> Get(int id)
{
    if (Request.Query.TryGetValue("id",out StringValues qs_id))
    {
        int.TryParse(qs_id.FirstOrDefault(), out id);
    }

    //...

    // method logic omitted

    //for testing purpose 

    return Ok($"id is {id}");
}

Результат испытаний

введите здесь описание изображения

Обновление:

Если возможно, вы также можете попытаться реализовать и использовать правила перезаписи URL-адресов для достижения этой цели.

<rule name="id qs rule">
    <match url="api/values" />
    <conditions>
          <add input="{PATH_INFO}" pattern="api/values$" />
          <add input="{QUERY_STRING}" pattern="id=([0-9]+)" />
    </conditions>
    <action type="Rewrite" url="api/values/{C:1}/" appendQueryString="false" />
</rule>

Результат испытаний

введите здесь описание изображения

06.02.2021
  • Хорошо, я должен был подумать об этом. Это кажется довольно очевидным, если немного взломать. Хотя я надеялся на что-то более элегантное. 06.02.2021
  • Привет @howcheng, вы можете попробовать другой подход, используя правило перезаписи URL, для получения подробной информации, пожалуйста, проверьте мое обновление. 06.02.2021
  • Наконец-то я вернулся к этому, но у меня проблемы с правилами перезаписи. Я задал новый вопрос по адресу stackoverflow.com/questions/66234483/ 17.02.2021
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]