[英]ASP.NET Core 5.0 RouteDataRequestCultureProvider remove default culture in url
[英]ASP.NET Core Error Handling with RouteDataRequestCultureProvider
我使用自定义RouteDataRequestCultureProvider
进行基于路由的本地化。 此定制实现从此处得到启发。
并且此路由用于重定向到默认语言(作为最后一条路由):
routes.MapRoute(
name: "catchAll",
template: "{*catchall}",
defaults: new { controller = "Language", action = "RedirectToDefaultLanguage", culture = "en" }
);
对于Cookie身份验证,我使用了:
...
options.LoginPath = "/login/";
options.LogoutPath = "/login/logout/"
...
对于错误处理,我在startup.cs
使用了以下代码段:
app.UseExceptionHandler("/error/index/500");
app.UseStatusCodePagesWithReExecute("/error/index/{0}");
例如,我使用了此代码段,但这些代码也不起作用:
...
options.LoginPath = "/{culture}/login/";
options.LogoutPath = "/{culture}/login/logout/"
...
和
app.UseExceptionHandler("/{culture}/error/index/500");
app.UseStatusCodePagesWithReExecute("/{culture}/error/index/{0}");
实际上,错误处理页面和登录页面不起作用,并且始终重定向到默认语言。 如何处理错误并通过路由本地化登录?
我从aspcore github获取并修改代码。 将原始字符串“ / Error / {0}”更改为“ / {1} / Error / {0}”,并添加我的区域性...仅在“ app.UseRequestLocalization”行之后放置“ app.UseStatusCodePages(异步上下文)”。
app.UseRequestLocalization(options);
app.UseStatusCodePages(async context =>
{
var newPath = new PathString(
string.Format(CultureInfo.InvariantCulture, "/{1}/Error/{0}", context.HttpContext.Response.StatusCode, System.Threading.Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName));
//var formatedQueryString = queryFormat == null ? null :
// string.Format(CultureInfo.InvariantCulture, queryFormat, context.HttpContext.Response.StatusCode);
//var newQueryString = queryFormat == null ? QueryString.Empty : new QueryString(formatedQueryString);
var newQueryString = QueryString.Empty;
var originalPath = context.HttpContext.Request.Path;
var originalQueryString = context.HttpContext.Request.QueryString;
// Store the original paths so the app can check it.
context.HttpContext.Features.Set<IStatusCodeReExecuteFeature>(new StatusCodeReExecuteFeature()
{
OriginalPathBase = context.HttpContext.Request.PathBase.Value,
OriginalPath = originalPath.Value,
OriginalQueryString = originalQueryString.HasValue ? originalQueryString.Value : null,
});
context.HttpContext.Request.Path = newPath;
context.HttpContext.Request.QueryString = newQueryString;
try
{
await context.Next(context.HttpContext);
}
finally
{
context.HttpContext.Request.QueryString = originalQueryString;
context.HttpContext.Request.Path = originalPath;
context.HttpContext.Features.Set<IStatusCodeReExecuteFeature>(null);
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.