Windows Server 2012上的Silverlight:CultureNotFoundException(" zh-Hans-CN")抛出,但机器已本地化为zh-CN

时间:2015-01-27 21:54:48

标签: .net silverlight localization windows-server-2012

我在Windows Server 2012计算机上托管了一个Silverlight 4应用程序。服务器本地化为中文(简体),文化代码zh-CN。我用以下的powershell证实了这一点:

PS C:\> get-culture

LCID             Name             DisplayName
----             ----             -----------
2052             zh-CN            Chinese (Simplified, PRC)

get-UICulture返回了我们,我怀疑是因为我是来自en-us机器的RDPing。我确认通过“控制面板区域”设置将UI文化设置为zh-CN。

当从应用程序抛出异常时,似乎在构造原始异常的细节时抛出了CultureNotFoundException。

简化示例:

List<string> items = { "a", "a" };
items.ToDictionary();

结果callstack:

System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) // throws a CultureNotFoundException referencing zh-Hans-CN
System.Collections.Generic.Dictionary.Insert(...) // throws an ArgumentException "Duplicate Key Added"
System.Linq.Enumerable.ToDictionary(...)

我们通过Silverlight应用报告的异常的详细信息是

[Argument_CultureNotSupported]
参数: 
调试资源字符串不可用。密钥和参数通常提供足够的信息用以诊断该问题。请访问 http://go.microsoft.com/fwlink/?linkid=106663&Version=5.0.10411.00&File=mscorlib.dll&Key=Argument_CultureNotSupported
参数名: name
[Argument_CultureInvalidIdentifier]
参数: zh-Hans-CN
调试资源字符串不可用。密钥和参数通常提供足够的信息用以诊断该问题。请访问 http://go.microsoft.com/fwlink/?linkid=106663&Version=5.0.10411.00&File=mscorlib.dll&Key=Argument_CultureInvalidIdentifier

在Silverlight应用程序中,字符串资源正在本地化为zh-CN,但似乎底层的.Net异常构造代码认为该应用程序位于zh-Hans-CN中。即使正确处理/抑制/丢弃原始异常,这也会导致报告异常。

从en-us机器浏览,不会引发CultureNotFoundExceptions作为异常过程的一部分。相反,我在上面的例子中看到了真正的“Duplicate Key added”ArgumentException。

我尝试将web.config全球化设置更改为包含

<system.web>
  <globalization culture="zh-CN" uiCulture="zh-CN" />
</system.web>

here所述,行为没有明显变化。

我已经阅读了zh-CN与zh-CHS对比zh-Hans-CN与zh-Hans的对比,对于非中国人而言,这一切都令人费解。除了最初的zh-CN之外,我还将zh-Hans资源添加到Silverlight .xap中,但这并没有改变行为。

我的直觉是.Net客户端核心正在寻找未安装在机器上的zh-Hans-CN或zh-Hans资源,尽管该机器肯定具有zh-CN资源并且每次测试都在zh-CN中我能想到。

我的具体目标是阻止CultureNotFoundExceptions被抛出,因为它们会导致红色鲱鱼,并且由于其他有效的本地化异常而混淆了代码中出现的真实异常。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

这里发生了很多事情:

1)Silverlight代码将System.Thread.CurrentThread.CurrentCulture设置为服务器的文化zh-CN,即使未安装该语言包。

2)Silverlight代码抛出了一个有效的.Net库异常(我相信InvalidOperationException)。

3)在InvalidOperationException的异常处理期间,.Net框架试图查找zh-CN(当前线程的当前文化)的本地化字符串。无法找到(语言包未安装),然后根据文化优先级规则查找其他语言/文化组合。当它最终到达zh-Hans-CN(链中的最后一个)时,它最后一次失败并抛出了CultureNotSupportedException。

4)CultureNotFoundException取代了原始的InvalidOperationException,导致该异常被报告给用户/日志。

最终解决方法是删除将Silverlight的CurrentThread.CurrentCulture设置为服务器的语言环境的代码。这是以前的黑客中的一件神器,无论如何已经过时了。