花费无数个小时研究一个bug后,我最终将问题归结为在.NET 5中使用
无论我使用什么配置在Azure中,它总是输出-1。
长话短说,Azure出了些问题。根据文档,我的Windows版本已经足够新,启用了ICU。看起来Azure应用服务要么使用了强制NLS模式,要么正在运行一些本地机器没有的ICU版本。
有人知道如何找出Azure正在使用哪个ICU版本(如果有的话),这样我就可以按照文档建议使用AppLocalIcu了吗?否则,如果明显是Azure方面的问题,则我的问题是要报告最好的位置是什么?
string.Compare
和StringComparison.InvariantCultureIgnoreCase
。考虑以下两个dotnetfiddles:NET 4.7.2:https://dotnetfiddle.net/KdErSK,NET 5:https://dotnetfiddle.net/ZWfprp。在运行.NET 4.7.2时,结果为-1,在运行.NET 5时,结果为1。
经过一些浏览,我发现了以下公告:https://learn.microsoft.com/en-us/dotnet/standard/base-types/string-comparison-net-5-plus和https://learn.microsoft.com/en-us/dotnet/core/extensions/globalization-icu。因此,按照这个说法,-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方面的问题,则我的问题是要报告最好的位置是什么?