Перенаправить на `error/404` при недопустимой культуре или неверном маршруте

В проекте NET Core 7 Razor Pages я использую локализацию маршрута.

ВProgram.csУ меня есть следующее:

        builder.Services.Configure<RequestLocalizationOptions>(x => {
    x.DefaultRequestCulture = new RequestCulture("pt");
    x.SupportedCultures = new List<CultureInfo> { new CultureInfo("en"), new CultureInfo("pt") };
    x.SupportedUICultures = new List<CultureInfo> { new CultureInfo("en"), new CultureInfo("pt") };
    x.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider { 
      RouteDataStringKey = "culture",
      UIRouteDataStringKey = "culture",
      Options = x
    }); 
  });

WebApplication application = builder.Build();

application.UseStatusCodePagesWithReExecute("/error/{0}");

application.UseRequestLocalization();

// ...

Мои страницы Razor выглядят следующим образом:

      @page "/{culture?}/contact"
@model ContactModel

Так когдаcultureопределено, что страница будет в этой культуре.

Когда он не определен, страница получает культуру по умолчанию, например, «PT».

Проблема в обработке ошибок. Я использую перенаправление кода состояния:

      application.UseStatusCodePagesWithReExecute("/error/{0}");

Если, например, я захожу на несуществующую страницу, меня перенаправляют на:

      @page "/errors/{code?}"
@model ErrorModel

Однако, если я попытаюсь получить доступ к «/abc», который не является допустимой культурой или действительной страницей, меня не перенаправят на .

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

Как я могу это сделать?

1 ответ

Однако, если я попытаюсь получить доступ к «/abc», который не является допустимой культурой или действительной страницей, я не перенаправляюсь на /error/4o4

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

Возможная причина:

Убедитесь, что в вашем файле есть атрибут register ниже:

      builder.Services.AddRazorPages();

app.UseRouting();

app.MapRazorPages();

Примечание. Не уверен, что они у вас уже есть. Кроме того, проверьте правильность написания названия страницы.@page "/errors/{code?}"тогда было бы какapplication.UseStatusCodePagesWithReExecute("/errors/{0}");

Меня следует перенаправить на /error/4o4, если я получаю доступ к маршруту, который начинается с недопустимой культуры или недопустимого маршрута страницы. Как я могу это сделать?

Это главное, что меня интересует. Для этого нет прямого решения. Однако у меня есть обходной путь для вас.

Выполнение:

Чтобы удовлетворить ваше требование, я рассмотрю две вещи:

  1. Я проверю параметр маршрута на
  2. На основеHttpContextзначение я проверюCultureInfo

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

Промежуточное ПО:

      public class CheckCultureAndRouteThenRedirect
    {
        private readonly RequestDelegate next;
        public CheckCultureAndRouteThenRedirect(RequestDelegate next)
        {
            this.next = next;
        }
        public async Task InvokeAsync(HttpContext context)


       
        {
          
            var routeURL = context.Request.Path.ToString();
            var host = context.Request.Host;
            var fullRoute= host + routeURL;
            if (routeURL != "/" && !routeURL.Contains("error"))
            {
                Uri requestedRoute = new Uri(fullRoute);

                string[] firstRoute = requestedRoute.Segments;
                string cultureRequested = firstRoute[1];
                var culture = cultureRequested.TrimEnd('/');


                CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;

                if (!cultureInfo.Name.Contains(culture))
                {

                    context.Response.Redirect("/error/404");
                    await context.Response.CompleteAsync();

                }
            }

            await next(context);
        }
    }

Примечание:

Убедитесь, что вы зарегистрировали промежуточное ПО вprogram.csфайл, как показано ниже:

      app.UseMiddleware<CheckCultureAndRouteThenRedirect>();

Выход:

Другие вопросы по тегам