微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 .NET CORE 3.1 Web 应用程序中使用多种文化

如何解决在 .NET CORE 3.1 Web 应用程序中使用多种文化

我们有一个网络应用程序,可以显示来自几个不同网络应用程序的数据。在每个网络应用中,文化都是可配置的(由公司管理员在应用级别为所有用户设置,而不是每个用户)。

在我们的网络应用程序中,我们需要以为该应用程序配置的文化显示来自每个其他网络应用程序的数据。唯一的好消息是,目前我们不会在单个视图中显示来自两个应用程序的“混合”数据。通常,控制器及其所有操作只能处理来自单个应用的数据(这意味着来自该控制器的所有操作都将使用相同的文化)。

有几件事我很挣扎:

  1. .NET Core 真的不像过去那样尊重设置文化吗?我试过了,但它不起作用(除非我将它设置在管道中的错误位置)。

    Thread.CurrentThread.CurrentCulture = firstWebAppCultureInfo; Thread.CurrentThread.CurrentUICulture = firstWebAppCultureInfo;

它真的只是检查这些来查找和设置文化吗?

QueryStringRequestCultureProvider
CookieRequestCultureProvider
AcceptLanguageHeaderRequestCultureProvider

我知道我可以编写自定义提供程序,但这似乎对我没有帮助。我们已经从数据库获取了应用的各种文化设置,并将它们存储在会话中。

  1. 我的第一个想法是在用户每次点击控制器时写出一个 Culture Cookie。我会从会话中读取文化并编写 cookie。但是我看到了一些问题。

问题 1:如果我在控制器操作中写出 cookie,它不会在第一次从一种文化更改为另一种文化时“生效”。显然,cookie 已经被读取,并且已经为该请求设置了文化。我做这件事已经太晚了。

我尝试在控制器的构造函数(或基本控制器的构造函数)中写出 cookie,但此时 HttpContext 尚未设置(为空)。

我在过滤器方面做了一些工作,我将编写一个动作过滤器来写入 cookie 以查看是否有效,但请参阅问题 2。

问题 2:如果用户打开浏览器的多个实例,则会出现另一个问题。我怀疑最后一种文化将“获胜”。因此,如果用户一个浏览器中以 Culture fr-FR 显示数据,在另一个浏览器实例中显示 en-US 并导航到写入该 en-US cookie 的控制器/视图,然后从另一个浏览器实例导航到应该使用 fr-FR 文化的页面用户将从 cookie 中获得 en-US 设置,这是不可接受的。

  1. 我真的不想使用 QueryStringRequestCultureProvider,因为在 url 中显示它很丑陋。

我绝对不是这方面的专家。

我错过了什么? 你们将如何实施?

提前致谢。

更新

我创建了一个 ActionFilter 和 TypeFilterattribute,它允许我将参数传递到 ActionFilter。使用参数,我可以决定从 Session 读取哪个键,以便为我提供我为每个 Web 应用程序存储的区域性设置。

从那里我可以用那个属性和适当的参数来标记每个控制器,以告诉操作过滤器使用什么文化(记住我们不混合数据,所以每个控制器显示的视图只显示来自两个 web应用程序,而不是两者)。

在 ActionFilter 中,我可以从会话中查找文化字符串并执行以下操作:

    var ci = new CultureInfo(this.cultureSetting);
    Thread.CurrentThread.CurrentCulture = ci;
    Thread.CurrentThread.CurrentUICulture = ci;

虽然这很令人鼓舞,但感觉很糟糕。所以请对解决方案发表评论...

我想找到一种在 BaseController 或其他地方完成所有这些操作的方法,这样我就不需要将属性放在我们所有的控制器上。

但是我在基本控制器中尝试过的任何东西似乎都是: a) 在管道中为该请求设置文化为时已晚,或 b) 在管道中为时过早,无法访问 httpcontext。

想法?想法?

更新 2

我想在我的基本控制器中覆盖 OnActionExecuting 可以让我做与 ActionFilter 相同的事情......

所以我想我有一个解决方案,但如果有人有更好的主意,我会倾听。

解决方法

我们决定为我们的解决方案使用 ActionFilter,这样我们就可以用一个属性标记控制器和/或操作,该属性指示我们从哪个应用程序获取数据,这样我们就可以应用该应用程序的文化设置...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。