Перенаправить на `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, если я получаю доступ к маршруту, который начинается с недопустимой культуры или недопустимого маршрута страницы. Как я могу это сделать?
Это главное, что меня интересует. Для этого нет прямого решения. Однако у меня есть обходной путь для вас.
Выполнение:
Чтобы удовлетворить ваше требование, я рассмотрю две вещи:
- Я проверю параметр маршрута на
- На основе
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>();
Выход: