【问题标题】:Why does "new CultureInfo("xx")" throw an exception in one environment but not in another?为什么 "new CultureInfo("xx")" 在一个环境中抛出异常,而在另一个环境中却没有?
【发布时间】:2020-12-22 08:49:18
【问题描述】:

我的 Asp.Net MVC 应用程序面向 .Net Framework 4.6.1

在我的开发环境中,这是可行的:

var x = new CultureInfo("xx")

版本信息:Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.8.4210.0 (我从随机错误页面中获得此信息,在同一个 MVC 应用程序的其他地方,它在底部提到)

Windows 10 版本 18363.1016 上的 IIS 10.0.18362.650 (从 IIS 管理器获得的信息 - 帮助 - 关于)

在托管的临时(和实时)环境中,相同的代码会引发异常

[CultureNotFoundException: Culture is not supported.
Parameter name: name
xx is an invalid culture identifier.]
   System.Globalization.CultureInfo..ctor(String name, Boolean useUserOverride) +230

版本信息:Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.8.3928.0 Windows Server 2012 R2 上的 IIS 8.5.9600.16384

我知道“xx”不是一种有效的文化(我只是用它来比较不同语言的资源文件,并且需要一种不存在的文化)。但我想知道的是为什么这在一个环境中失败而在另一个环境中起作用。 asp.net 版本(几乎)相同。

【问题讨论】:

标签: c# .net iis globalization


【解决方案1】:

当您创建一种名称为“aaa”的文化时,会发生什么 is 不是 Windows 携带的名称之一,当时的 Windows 将尝试为我们创建它并尝试将文化属性填充为 通过匹配语言部分和国家/地区部分可以做到这一点。为了 例如,如果我尝试创建我认为不存在的 ja-US,Windows 将尝试通过从以下位置获取语言信息来伪造文化 日语,将从美国获取国家信息, 将其融入新的文化。现在当通过“aaa”时 匹配任何语言/国家,Windows 将只使用不变的文化 属性。这就是你所看到的。

这是由 Windows 启动 Windows 10 定义的行为,而不是 真正的.NET。框架只是调用操作系统来获取 需要的信息。 CreateSpecificCulture 的代码只是调用 最后是操作系统。

Source

【讨论】:

  • 那么显然 Windows Server 2012 的行为会有所不同?
  • @fre_der 是的,Windows Server 2012 是“基于”Windows 8 的,所以我认为在 Windows Server 2016 上可以观察到相同的行为(在 Windows 10 中观察到)(鉴于它是“基于”Windows 10)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
相关资源
最近更新 更多