День 1493. #ЗаметкиНаПолях #TipsAndTricks
Используем Сгенерированное Регулярное Выражение в Ограничениях Маршрута ASP.NET Core
Регулярное выражение на основе сгенерированного кода предоставляет несколько преимуществ по сравнению с традиционным классом Regex:
- Более быстрое время запуска, так как весь код генерируется во время компиляции. Не нужно анализировать шаблон регулярного выражения и генерировать оптимизированный код для выполнения регулярного выражения во время выполнения.
- Улучшенная поддержка тримминга. Код, который не используется, не включается в окончательный бинарный файл.
- Улучшенная поддержка отладки. Вы можете пройтись по коду и посмотреть, что происходит.
Чтобы использовать генератор исходного кода для регулярных выражений, вам необходимы .NET 7 и C# 11. Для стандартных регулярных выражений IDE вроде Visual Studio или Rider даже предложат вам автоматически преобразовать их на использование генераторов кода.
Маршрутизация ASP.NET Core позволяет устанавливать ограничения на параметры маршрута. Ограничение может быть шаблоном регулярного выражения. В большинстве случаев этот шаблон – строковая константа:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseRouting();
app.MapGet(
"{value:regex(^([01]?[0-9]|2[0-3]):[0-5][0-9]$)}",
(string value) => "Время: " + value);
app.Run();
Этот код гарантирует, что параметр value соответствует времени в 24-часовом формате.
Однако ASP.NET Core предоставляет возможность создавать собственные ограничения путем реализации IRouteConstraint или наследования от класса, реализующего этот интерфейс. В этом случае вы можете использовать RegexRouteConstraint и предоставить регулярное выражение в конструкторе:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRouting(options =>
{
// регистрируем ограничение
options.ConstraintMap.Add(
"time", typeof(TimeRouteConstraint));
});
var app = builder.Build();
app.UseRouting();
app.MapGet(
"{value:time}",
(string value) => "Время: " + value);
app.Run();
sealed partial class TimeRouteConstraint
: RegexRouteConstraint
{
[GeneratedRegex("^([01]?[0-9]|2[0-3]):[0-5][0-9]$")]
private static partial Regex TimeRegex();
public TimeRouteConstraint()
: base(TimeRegex())
{
}
}
Источник: https://www.meziantou.net/using-source-generated-regex-in-asp-net-core-routing.htm