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);
        }
    });