Dynami c маршрутизация в ASP. NET Core 3.1, когда часть URL уже является другим маршрутом - PullRequest
2 голосов
/ 29 января 2020

Я пытаюсь использовать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...