我在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被抛出,因为它们会导致红色鲱鱼,并且由于其他有效的本地化异常而混淆了代码中出现的真实异常。
非常感谢任何帮助!
答案 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设置为服务器的语言环境的代码。这是以前的黑客中的一件神器,无论如何已经过时了。