Después de pasar innumerables horas para llegar al núcleo de un error, finalmente reduje un problema al uso de string. StringComparison.InvariantCultureIgnoreCase string.Compare .NET 5.
Considere los siguientes dos dotnetfiddles:
Cuando ejecuta .NET 4.7.2 obtiene -1 como resultado, cuando ejecuta .NET 5 obtiene 1 como resultado.
Después de navegar un poco, esto llevó al siguiente aviso:
Entonces, siguiendo esto, un resultado de -1 es la versión NLS, mientras que el resultado de .NET 5 de 1 es la versión ICU.
Sin embargo, cuando abro un Azure App Service en modo .NET 5, el resultado del código anterior en una página de Razor es -1, también conocido como: la versión NLS.
Esto puede causar todo tipo de problemas extraños, porque dos sistemas diferentes conducen a resultados inesperados.
Cuando agrego lo siguiente a mi archivo de proyecto, como se mencionó en el último artículo, mi entorno local también genera un -1.
<ItemGroup> <RuntimeHostConfigurationOption Include="System.Globalization.UseNls" Value="true" /> </ItemGroup>No importa qué tipo de configuración use en Azure, siempre seguirá generando -1.
Larga historia, algo está pasando en Azure. Según la documentación, mi versión de Windows es lo suficientemente nueva como para tener ICU habilitada. Parece que Azure App Service está usando un modo NLS forzado o está ejecutando alguna versión de ICU que mi máquina local no tiene.
¿Alguien sabe cómo puedo averiguar qué versión de ICU (si corresponde) está usando Azure, de modo que pueda usar la sugerencia de la documentación para usar AppLocalIcu? De lo contrario, si algo está claramente del lado de Azure, mi pregunta es cuál sería la mejor ubicación para informar esto.
Alguien en el equipo de Azure App Service se sumergió en esto:
Major Minor Build Revision ----- ----- ----- -------- 10 0 14393 0Entonces, para responder a mi propia pregunta: Azure App Services de hecho usa NLS de forma predeterminada. ¡Esto no es un error!
Al incluir lo siguiente en su archivo de proyecto, ICU se verá obligado a:
<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>Esto está en línea con la solución que mencionó @Crazy Crab, ¡gracias!
Consulte también https://www.nuget.org/packages/Microsoft.ICU.ICU4C.Runtime para obtener la versión más reciente (68.2.0.9 en el momento de escribir este artículo).
Voy a aceptar mi propia respuesta, ya que siento que da una mejor respuesta a la pregunta "¿Por qué sucede esto?", en lugar de simplemente solucionarlo.
Creo que puede usar este método para habilitar la ICU local de la aplicación en el servicio de aplicaciones de Azure.
Si su aplicación web es una aplicación que depende del marco, puede consumir ICU a través de un paquete NuGet.
<RuntimeHostConfigurationOption Include="System.Globalization.AppLocalIcu" Value="<suffix>:<version> or <version>" /> en la sección <ItemGroup> . O puede agregar una configuración de aplicación DOTNET_SYSTEM_GLOBALIZATION_APPLOCALICU con el valor <suffix>:<version> o <version> .Luego, puede usar la versión especial de ICU en Azure App Service como desee.