#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. Я настроил этот проект и попробовал, кажется, вы правы. Из того, что я могу прочитать, это связано с маркировкой значений маршрута. Я не могу найти ни одного простого примера обхода этого, поэтому добавил пару предложений о том, как обойти это.