全球化在部署后的所有场景中都错误地使用默认文化

Globalization incorrectly uses default culture in all scenarios after deployment

本地环境:
Win10 x64
VS 2015 专业更新 3
IIS 10.0 速成版

生产环境:
赢服务器 2012 R2
IIS 8.5

我正在开发需要英语、丹麦语和荷兰语支持的 ASP.NET 4.6.1 MVC 应用程序。我实施中性文化,因为我只对语言感兴趣,对细节不感兴趣。 我使用附属程序集(有些人会这样称呼它们)或 Resource.resx 文件进行翻译。我遵循的第一种方法 this often referenced post and it works perfectly locally. As soon as i deploy it to the production environment translations stop working. I set the threads according to database values: 而且我已经验证了这个方法在生产环境中总是正确执行的。我已经尝试像在引用的 post 中那样设置线程,这在本地也可以正常工作,但在生产中却不行。我什至尝试使用剃刀将其直接设置为我的观点的顶部,但无济于事。
让我感到非常奇怪的是,在我做了一些摆弄之后,我让它在生产环境中工作了一次,但我很确定我没有真正做任何事情,但突然间它工作了。遗憾的是,在我对应用程序部署更新后它停止工作,从那以后我就无法让它工作了。从那以后,我尝试在 IIS 的 .NET 环境中为这个网站和根目录搞乱所有设置:
但即使在此处指定 da-DKda 作为区域性或直接在我的应用程序的 web.config 中指定或硬编码要使用的线程da 因为文化根本没有帮助。有趣的是数字和日期格式正确更改。因此,线程没有改变其文化似乎不是问题,而是 IIS 拒绝使用其他资源文件。部署后,文件夹结构在 bin 中有 da 文件夹,它包含一个名为 Resources.resources.resx[=37 的文件=] 我认为这是正确的。我尝试按照文章的建议将资源文件放在 class 库中,但出于挫败感,我也尝试将其放在同一项目的文件夹中。资源文件设置为 public 可访问性,并在不复制文件的情况下编译为嵌入式资源。

所以我的问题是,为什么 IIS 拒绝使用默认资源文件以外的任何其他资源文件?它怎么可能 一次 ?在这一点上,我正在考虑只将翻译带到数据库中,因为至少那是可行的。你有什么建议?我相信 IIS 上的 .NET 环境安装了所有必要的语言,因为它们在 .NET 全球化设置中可见,但我可能错了?

更新:我尝试了 NightOwl 的建议,它再次在本地工作(VS 调试),即使我在我的机器上的 iisexpress 中托管部署的文件。但是在生产环境中还是失败了。建议的方法类似于 this 但仍然没有成功。我开始认为解决方案是在生产环境中升级到iis 10。

那篇文章似乎有一些 pre-MVC 想法:

  • MVC 不完全支持资源文件(至少不是没有 hack)- 请参阅 Resource Files and ASP.NET MVC Projects. However, you can use embedded resources or use a ResourceManager 加载外部资源。
  • 根据浏览器设置来设置用户语言通常是错误的选择。相反,您应该使用 URL 来传递文化信息,以便搜索引擎可以对它们进行抓取和索引。本地化是内容而不是个性化。依靠 headers 来显示正确的语言可能会让坐在改变这些 headers 的防火墙后面的用户感到沮丧。使用 URL 选择语言可以让用户直接控制语言。

请参阅我对 ASP.NET MVC 5 culture in route and url 的回答以了解进行本地化的纯 MVC 方式。

基本上,您问题的答案在 this link 中 - 默认情况下,App_GlobalResources 中的资源是内部资源,不修改设置就无法使用。它们在部署期间需要特别注意,否则它们将不会与您的应用程序一起部署。 App_LocalResources 在 MVC 中完全不受支持(它们用于遗留 ASP.NET 页面)。简而言之:避免在 MVC 中使用 App_GlobalResourcesApp_LocalResources(它们有其自身的一系列问题)。

Off-topic: It looks like you are also using a base controller (because of the Initialize method). This tightly couples your application together. A better way is to use global filters, which can each contain a single piece of functionality. See this answer.

问题是由 Nuget 包 SimpleImpersonation 引起的,它似乎在幕后改变了当前线程的文化。似乎它在处理后将其更改回默认值,但是当我在设置文化时引用有效时,它总是默认回 en-US。它在 IIS Express 10.0 中本地工作仍然很奇怪。但至少现在它适用于两种环境...