繁体   English   中英

使用RouteDataRequestCultureProvider的ASP.NET Core错误处理

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM