C# 使用RouteDataRequestCultureProvider处理ASP.NET核心错误
我使用了一个定制的C# 使用RouteDataRequestCultureProvider处理ASP.NET核心错误,c#,asp.net-mvc,asp.net-core,.net-core,C#,Asp.net Mvc,Asp.net Core,.net Core,我使用了一个定制的RouteDataRequestCultureProvider进行基于路由的本地化。此自定义实现的灵感来自 此路由用于重定向到默认语言(作为最后一个路由): 对于cookie身份验证,我使用了: ... options.LoginPath = "/login/"; options.LogoutPath = "/login/logout/" ... 对于错误处理,我在startup.cs中使用了这个代码段: ap
RouteDataRequestCultureProvider
进行基于路由的本地化。此自定义实现的灵感来自
此路由用于重定向到默认语言(作为最后一个路由):
对于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/"
...
及
事实上,错误处理页面和登录页面不起作用,并且总是重定向到默认语言。如何处理错误并使用路由本地化登录?我从aspcore github获取并修改代码。将原始字符串“/Error/{0}”更改为“/{1}/Error/{0}”,并添加我的区域性。。。将“app.UseStatusCodePages(异步上下文)”仅放在“app.UseRequestLocalization”行之后
app.UseRequestLocalization(选项);
app.UseStatusCodePages(异步上下文=>
{
var newPath=新路径字符串(
格式(CultureInfo.InvariantCulture,“/{1}/Error/{0}”、context.HttpContext.Response.StatusCode、System.Threading.Thread.CurrentThread.CurrentUICulture.TwoLetterIsLanguageName);
//var formattedquerystring=queryFormat==null?null:
//格式(CultureInfo.InvariantCulture、queryFormat、context.HttpContext.Response.StatusCode);
//var newQueryString=queryFormat==null?QueryString.Empty:新QueryString(formattedquerystring);
var newQueryString=QueryString.Empty;
var originalPath=context.HttpContext.Request.Path;
var originalQueryString=context.HttpContext.Request.QueryString;
//存储原始路径,以便应用程序可以检查它。
context.HttpContext.Features.Set(新的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;
尝试
{
wait context.Next(context.HttpContext);
}
最后
{
context.HttpContext.Request.QueryString=originalQueryString;
context.HttpContext.Request.Path=originalPath;
context.HttpContext.Features.Set(null);
}
});
欢迎来到SO,Alex!这里不鼓励只使用代码的答案,因为它们不能直观地说明问题是如何解决的。请更新您的解决方案,并解释您的代码是如何解决手头的问题的
...
options.LoginPath = "/{culture}/login/";
options.LogoutPath = "/{culture}/login/logout/"
...
app.UseExceptionHandler("/{culture}/error/index/500");
app.UseStatusCodePagesWithReExecute("/{culture}/error/index/{0}");
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);
}
});