Как использовать регулярное выражение для сопоставления части URL-адреса в части маршрута? WebAPI .NET core 2.2

#c# #asp.net-core-webapi

#c# #asp.net-core-webapi

Вопрос:

Сейчас я пытаюсь написать приложение WebAPI. В части маршрута (контроллер) я хочу использовать регулярное выражение для сопоставления части url. Однако, похоже, это "/" не может быть распознано должным образом.

Например, URL-адрес api является "api/books/science/list" . Я хочу получить "api/books/science" и "list" . Я попробовал следующее регулярное выражение [HttpGet("{url=.*}/list")] . Но, похоже, регулярное выражение не работает. ".*" не может совпадать "" .

API разработан "api/*{path}/list" следующим образом. Для *{path} , он может иметь несколько структур, таких как books/science или books/art/Asia' . Я хочу использовать регулярное выражение для их сопоставления, а затем их можно использовать для следующих операций.

На самом деле, я попробовал другой метод получения URL [HttpGet("{**url}")] -адреса. Но я полагаю, что это не очень хорошее решение, потому что тогда мне нужно проанализировать URL-адрес.

Комментарии:

1. Похоже, требуемая функция не поддерживает улучшения маршрутизации . Так грустно: (

Ответ №1:

Регулярное выражение поддерживается через :regex() параметр. См. раздел Маршрутизация в ASP.NET Основная документация по регулярным выражениям для получения информации и, например, промежуточное программное обеспечение маршрутизации.

Попробуйте: [HttpGet("{url:regex(.*)}/list")] как вы указали, это не работает, потому что оно работает с токенизированным значением URL-адреса маршрута.

Одной из альтернатив является использование универсального подхода в маршрутизации (в Startup.cs):

 routes.MapRoute(
    name: "therest",
    template: "/{**url}",
    defaults: new { controller = "Home", action="Index"} // Send to /home/index
);
  

Или, если вы знаете, что количество элементов пути будет ограничено, вы можете просто включить их все:

 [HttpGet("/{url1}")]
[HttpGet("/{url1}/{url2}")]
[HttpGet("/{url1}/{url2}/{url3}")]
[HttpGet("/{url1}/{url2}/{url3}/{url4}")]
public IActionResult Test(string url1 = null, string url2 = null, string url3 = null, string url4 = null)
{
    var url = string.Join("/", url1, url2, url3, url4);
    //... return View();
}
  

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

Комментарии:

1. Спасибо за ваши ответы. [HttpGet("{url:regex(.*)}/list")] не может совпадать "/" . Я имею в виду для примера books/list , ДА, регулярное выражение может совпадать и "url" может получить значение "books" . Однако, если пример есть books/science/list , регулярное выражение не работает.

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