Я пытаюсь использовать DynamicRouteValueTransformer
с IEndpointRouteBuilder.MapDynamicControllerRoute
для динамического отображения новых маршрутов. Это для страниц, которые добавляются во время работы приложения.
Я делаю:
endpoints.MapDynamicControllerRoute<RouteValueTransformer>("{**slug}");
, чтобы перехватить все URL, которые еще не имеют маршрут назначен, так что RouteValueTransformer
может попытаться найти его при необходимости. Поместив точку останова в метод RouteValueTransformer.TransformAsync
, я могу видеть, когда он запускается. Если вы просто наберете какой-нибудь бессмысленный URL-адрес, он введет метод, как и ожидалось. Для URL, которому не назначен маршрут, но более ранняя часть URL делает , он не будет вводить метод, так как кажется, что он уже имеет маршрут, но тогда это, очевидно, дает ошибку 404.
Например, если после указанной выше строки я делаю
endpoints.MapControllerRoute(
name: "test",
pattern: "category/product1",
defaults: new { controller = "Home", action = "Index" });
, а затем пытаюсь перейти к «category / product2», я думаю, что нужно ввести метод TransformAsync
, чтобы попытаться найти маршрут, но это не так, и это дает 404. Если вы измените «категорию» на что-то еще, будет ввести метод.
Я не уверен, если Это ожидаемое поведение, ошибка, или если я неправильно использую параметр «pattern», или, может быть, {** slug} неправильно?
Воспроизвести
Воспроизвести очень легко. Создайте новое ASP. NET Core 3.1 веб-приложение. Добавьте
app.UseEndpoints(endpoints =>
{
var defaults = new { controller = "Home", action = "Index" };
endpoints.MapControllerRoute(name: "test", pattern: "category/product1", defaults: defaults);
endpoints.MapDynamicControllerRoute<RouteValueTransformer>("{**slug}");
});
в конец Startup.Configure
,
services.AddSingleton<RouteValueTransformer>();
к Startup.ConfigureServices
и
public class RouteValueTransformer : DynamicRouteValueTransformer
{
public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
{
return values;
}
}
и установите точку останова на return values;
чтобы увидеть, когда он запускается.
Что еще я пробовал
endpoints.MapDynamicControllerRoute<RouteValueTransformer>("{one}/{two}");
- также не вводит метод.
Просмотр документации. DynamicRouteValueTransformer
(пока) , к сожалению, не так много, поэтому я нашел это довольно трудным.
Обновление
Я начинаю думать, что это это , скорее всего, ошибка, поэтому я поднял эту проблему с Github