Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 全球化在部署后的所有场景中都不正确地使用默认区域性_.net_Asp.net Mvc_Iis 8_Globalization_Windows Server 2012 R2 - Fatal编程技术网

.net 全球化在部署后的所有场景中都不正确地使用默认区域性

.net 全球化在部署后的所有场景中都不正确地使用默认区域性,.net,asp.net-mvc,iis-8,globalization,windows-server-2012-r2,.net,Asp.net Mvc,Iis 8,Globalization,Windows Server 2012 R2,本地环境: Win10 x64 VS 2015专业版更新3 IIS 10.0 Express 生产环境: Win server 2012 R2 IIS 8.5 我正在开发一个ASP.NET 4.6.1 MVC应用程序,需要英语、丹麦语和荷兰语支持。我实施中立文化,因为我只对语言感兴趣,而对细节不感兴趣。 我使用附属程序集(有些人称之为附属程序集)或Resource.resx文件进行翻译。我遵循的第一种方法在本地非常有效。一旦我将其部署到生产环境中,翻译就会停止工作。我根据数据库值设置线程: 我已

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

生产环境:
Win server 2012 R2
IIS 8.5

我正在开发一个ASP.NET 4.6.1 MVC应用程序,需要英语、丹麦语和荷兰语支持。我实施中立文化,因为我只对语言感兴趣,而对细节不感兴趣。 我使用附属程序集(有些人称之为附属程序集)或Resource.resx文件进行翻译。我遵循的第一种方法在本地非常有效。一旦我将其部署到生产环境中,翻译就会停止工作。我根据数据库值设置线程: 我已经验证了这个方法在生产环境中总是正确执行的。我也尝试过像参考文章中那样设置线程,在本地也可以很好地工作,但在生产环境中不行。我甚至尝试使用razor将其直接设置为我视图的顶部,但没有任何效果。
让我感到奇怪的是,在我做了一些修改之后,我曾经让它在生产环境中工作过一次,但我很确定我没有真正做任何事情,它突然工作了。遗憾的是,在我将更新部署到应用程序后,它停止了工作,此后我一直无法让它工作。此后,我尝试在IIS上更改此网站和根目录的.NET环境中的所有设置:
但是,即使在此处或直接在我的应用程序的web.config中指定da DK或da作为区域性,或硬编码线程以使用da作为区域性,也没有任何帮助。有趣的是,数字和日期格式正确地改变了。因此,线程没有改变其区域性似乎不是问题,而是IIS拒绝使用其他资源文件。部署时,文件夹结构在bin中有da文件夹,它包含一个名为Resources.Resources.resx的文件,我认为这是正确的。正如文章所建议的,我试着将资源文件放在类库中,但出于沮丧,我还将其放在同一项目的文件夹中。资源文件设置为公共可访问性,并作为嵌入式资源编译,而不复制文件

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


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

那篇文章似乎有一些MVC之前的想法:

  • MVC不完全支持资源文件(至少在没有黑客攻击的情况下),请参阅。但是,您可以使用或使用来加载外部资源
  • 根据浏览器设置设置用户语言通常是错误的选择。相反,您应该使用URL来传递区域性信息,以便搜索引擎可以对其进行爬网和索引。本地化是内容而不是个性化。依靠标题显示正确的语言可能会让坐在防火墙后面更改这些标题的用户感到沮丧。使用URL选择语言可以直接控制用户的语言
请参阅我的答案,以了解进行本地化的纯MVC方法

基本上,您的问题的答案是-默认情况下,
App\u GlobalResources
中的资源是内部资源,在未修改设置的情况下无法使用。它们在部署期间需要特别注意,否则将不会与应用程序一起部署<代码>应用程序本地资源在MVC中根本不受支持(它们用于传统ASP.NET页面)。简而言之:避免在MVC中使用
App\u GlobalResources
App\u LocalResources
(它们有自己的一系列问题)

非主题:看起来您也在使用基本控制器(因为
初始化
方法)。这将把您的应用程序紧密地结合在一起。更好的方法是使用全局过滤器,每个过滤器可以包含一个功能。看


这个问题是由Nuget包SimpleImpersonation引起的,它似乎在幕后改变了当前线程的文化。看起来它在释放后会将其更改回默认值,但由于我在设置区域性时引用是有效的,所以它总是默认返回到en US。它在IIS Express 10.0中本地工作仍然很奇怪。但至少现在它适用于两种环境…

感谢您的快速回答,我认为您错过了几点。这篇文章是专门关于MVC的,在许多其他SO文章中都有引用。最初我确实为.resx文件使用了一个单独的类库,但出于绝望,我尝试将它们放在同一个项目中。App_LocalResources只是来自某个地方的灵感,在本例中,它实际上与非MVC的东西无关。我将更新我的问题,以更好地反映这一点。Cookies vs URL与这种情况完全无关,它不会改变任何事情。我从数据库中获取文化名称。我不认为过滤器会改变任何东西?
这篇文章是专门关于MVC的,在许多其他SO帖子中都有引用。
-我意识到这一点,但不幸的是,作者在文章中使用了很多MVC之前的想法,并将你引入歧途。过滤器会改变一些东西——它让你用MVC的方式来做,而不是从ASP.NET复制旧的(坏的)习惯,并将你的代码紧密地耦合在一起