c# - Azure 应用服务似乎在 .NET 5 模式下启用了 NLS

标签 c# azure globalization icu nls

在花费了无数个小时来了解错误的核心之后,我最终将问题归结为在 . NET 5。

考虑以下两个 dotnetfiddles:

运行 .NET 4.7.2 时,结果为 -1;运行 .NET 5 时,结果为 1。

经过一番浏览后,出现以下通知:

因此,-1 的结果是 NLS 版本,而 .NET 5 结果 1 是 ICU 版本。

但是,当我在 .NET 5 模式下启动 Azure 应用服务时,上述代码在 Razor 页面中的结果是 -1,又名:NLS 版本。

这可能会导致各种奇怪的问题,因为两个不同的系统会导致意外的结果。

当我将以下内容添加到我的项目文件中时,如上一篇文章中所述,我的本地环境也会输出 -1。

<ItemGroup>
  <RuntimeHostConfigurationOption Include="System.Globalization.UseNls" Value="true" />
</ItemGroup>

无论我在Azure中使用哪种配置,它都会一直输出-1。

说来话长,Azure 上出了点问题。根据文档,我的 Windows 版本足够新,可以启用 ICU。看起来 Azure 应用服务要么使用强制 NLS 模式,要么正在运行我的本地计算机没有的某些 ICU 版本。

有人知道我如何找出 Azure 正在使用哪个 ICU 版本(如果有),以便我可以使用文档中的建议来使用 AppLocalIcu?否则,如果某些东西明显位于 Azure 一侧,那么我的问题是报告此情况的最佳位置是什么?

最佳答案

Azure 应用服务团队的某人深入研究了这个问题:

  • 大多数 Azure 应用服务都在 Windows 2016 上运行,更具体地说,在撰写本文时:
Major  Minor  Build  Revision
-----  -----  -----  --------
10     0      14393  0   
  • 在 Windows Server 环境中,ICU 是在 Windows Server 2019 中引入的。

所以回答我自己的问题:Azure 应用服务确实默认使用 NLS。这不是一个错误!

通过在项目文件中包含以下内容,将强制使用 ICU:

<ItemGroup Condition="'$(OS)' == 'Windows_NT'">
  <PackageReference Include="Microsoft.ICU.ICU4C.Runtime" Version="68.2.0.9" />
  <RuntimeHostConfigurationOption Include="System.Globalization.AppLocalIcu" Value="68.2" />
</ItemGroup>

这与@Crazy Crab提到的解决方案一致,谢谢!

另请参阅https://www.nuget.org/packages/Microsoft.ICU.ICU4C.Runtime最新版本(撰写本文时为 68.2.0.9)。

我将接受我自己的答案,因为我觉得它为“为什么会发生这种情况”问题提供了更好的答案,而不仅仅是修复它。

关于c# - Azure 应用服务似乎在 .NET 5 模式下启用了 NLS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69005962/

相关文章:

azure - 使用 Elastic Query 更新弹性池 Db 中表的一行

asp.net - HTML 控件的全局化

c# - 在 MouseDown 中创建 Thumb 并拖动它?

c# - 限制相机旋转角度

c# - Linq 在 C# Lambda 表达式中使用 Distinct()

c# - 在 for 循环中用匿名方法闭包

javascript - 带 SSL 的 Azure 辅助角色上的 Node.js 会导致 ERR_SSL_PROTOCOL_ERROR

azure - 在文档数据库中使用 JOIN 进行查询

c# - 在 CultureInfo 中获取当前语言

c# - winform 本地化为阿拉伯语并更改对齐方式