CurrentCulture неправильно по умолчанию для en-US в ASP.net
Я только что перенес около 100 сайтов ASP.net из IIS 6 в Windows Sever 2003 в IIS 7 в Windows 2008. Я только что заметил, что различные фрагменты кода, использующие такие вещи, как DateTime.Parse, начали выдавать ошибки "Строка не была признан действительным DateTime". Я связал это с тем фактом, что текущая культура сайтов по умолчанию настроена на "en-US", и поэтому мои британские пользователи вводят даты в неожиданном формате.
Вопрос в том, откуда они попадают в США? Начиная сверху, если я смотрю в "Панель управления> Регион и язык", все настроено на английский (Великобритания). В web.configs сайтов либо нет раздела
Я не могу найти где-нибудь, что настраивает культуру на "en-US"... но что-то есть.
Thread.CurrentThread.CurrentCulture.Name is outputting 'en-US'
Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencySymbol is outputting '$'
Я могу решить эту проблему, добавив
Я что-то пропустил?
10 ответов
Это альтернативные места, где вы можете искать:
Я не могу найти где-нибудь, что настраивает культуру на "en-US"... но что-то есть.
Thread.CurrentThread.CurrentCulture.Name выводит 'en-US' Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencySymbol выводит '$'
Попробуйте найти InitializeCulture
метод, этот метод переопределяется на страницах ASP.Net для установки культуры следующим образом:
protected override void InitializeCulture()
{
var hidden = this.Request.Form["hidden"];
var culture = this.Request.Form[hidden];
if (!string.IsNullOrWhiteSpace(culture))
{
this.Culture = culture;
this.UICulture = culture;
}
base.InitializeCulture();
}
Попробуйте найти следующие атрибуты сборки:
[assembly: AssemblyCulture("en-US")]
[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.MainAssembly)]
Попробуйте найти следующие атрибуты страницы:
<%@ Page Culture="en-US" UICulture="en-US" Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
Попробуйте посмотреть в web.configs:
<globalization uiCulture="en-US" culture="en-US" enableClientBasedCulture="false" />
Редактировать 1
Попробуйте поискать HttpHandlers или HttpModules, пытающиеся установить язык
Попробуйте посмотреть в иерархии web.config (на сервере, <wwwroot>
означает корневую папку вашего веб-сайта IIS)
- Глобальная машина.
<windir>\Microsoft.NET\Framework\<ver>\Config\Machine.config
- Корневой веб-конфиг.
<windir>\Microsoft.NET\Framework\<ver>\Config\Web.config
- Веб-сайт.
<wwwroot>\Web.config
- Веб приложение.
<wwwroot>\<webapp>\Web.config
- Папка.
<wwwroot>\<webapp>\<dir>\Web.config
Если у вас есть несколько серверов (веб-ферма), убедитесь, что вы перенаправлены на правильный сервер (тот, на котором вы проверяете конфигурацию), чтобы сделать это, вы можете использовать ip нужного сервера или настроить файлы хоста в своем клиентский компьютер
У меня была та же проблема, и через много часов я обнаружил, что, хотя региональные настройки были правильными, мне также нужно было изменить исходную культуру для всех зарезервированных учетных записей (например, ASP.NET).
Это делается с помощью кнопки "Копировать настройки..." на вкладке " Администрирование " в региональных настройках. Настройки копируются, если вы включите флажок "Экран приветствия и системные учетные записи".
Если я добавлю раздел глобализации в корневой каталог web.config ( windir\Microsoft.NET\Framework\ver\Config\Web.config), установив en-GB, это решит мою проблему и распространится на другие сайты. Который вроде решает мою проблему. Тем не менее, он не объясняет, откуда он по умолчанию получает en-US, но это должно сработать. Благодарю.
Веб-приложение.Net использует культуру вашего браузера по умолчанию. Например, в FF язык по умолчанию установлен так, как показано на рисунке ниже.
Так что, если вы хотите, чтобы культура вашего сайта отличалась от той, которую использует браузер, в методе InitializeCulture страницы (создайте BasePage, оставьте здесь код ниже и унаследуйте существующие страницы от этой BasePage).
protected override void InitializeCulture()
{
System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.GetCultureInfo("en-GB");
System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
base.InitializeCulture();
}
}
Это может происходить из культуры системной учетной записи, используемой для запуска пула приложений или веб-приложения.
Проверьте эту ссылку: различные настройки культуры между IIS и ASP.NET
В моем случае мой пул приложений работал от имени моего пользователя домена, для которого текущая культура была настроена на en-GB, и приложение работало нормально с форматом даты en-GB.
Вместо этого я изменил пул приложений для запуска под сетевой службой, и внезапно разошлись вызовы DateTime.Parse, поскольку приложение теперь использовало культуру en-US. Я видел несколько сообщений SO ( например) о том, как культуры IIS зависят от пользователя, что объясняет это.
Открытие.NET Globalization для корневого элемента в IIS Manager и настройка и Culture и UI Culture на English UK (en-GB) исправили это для меня.
У меня была эта проблема с установкой Windows Server Core 2022, поэтому нет простого решения пользовательского интерфейса, такого как «Копировать настройки» на вкладке «Региональные настройки». Я хотел решение Powershell или CLI, и, как вы говорите, его можно применять для пользователя, но не копировать для всех пользователей.
В этом мне помогла статья Льюиса Робертса в его блоге https://www.lewisroberts.com/2017/03/01/set-language-culture-timezone-using-powershell/
Вам нужно использоватьcontrol.exe
для импорта XML-файла региональных настроек. Следующее будет для Великобритании, поэтому настройте его в соответствии с вашими требованиями.
Сохраните следующий XML в файл с именемUKRegion.xml
или все, что вы хотите.
<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend">
<!--User List-->
<gs:UserList>
<gs:User UserID="Current" CopySettingsToDefaultUserAcct="true" CopySettingsToSystemAcct="true"/>
</gs:UserList>
<!-- user locale -->
<gs:UserLocale>
<gs:Locale Name="en-GB" SetAsCurrent="true"/>
</gs:UserLocale>
<!-- system locale -->
<gs:SystemLocale Name="en-GB"/>
<!-- GeoID -->
<gs:LocationPreferences>
<gs:GeoID Value="242"/>
</gs:LocationPreferences>
<gs:MUILanguagePreferences>
<gs:MUILanguage Value="en-GB"/>
<gs:MUIFallback Value="en-US"/>
</gs:MUILanguagePreferences>
<!-- input preferences -->
<gs:InputPreferences>
<!--en-GB-->
<gs:InputLanguageID Action="add" ID="0809:00000809" Default="true"/>
</gs:InputPreferences>
</gs:GlobalizationServices>
Затем импортируйте его с помощью следующей команды (в формате Powershell):
& $env:SystemRoot\System32\control.exe "intl.cpl,,/f:`"UKRegion.xml`""
Вам все еще нужна перезагрузка, но это сработало для меня и заставило рабочих ASP.NET использоватьen-GB
locale по умолчанию без необходимости устанавливать его в коде или в файле web.config.
Это было особенно полезно для меня, поскольку я использую его для настройки экземпляров EC2 с использованием шаблонов запуска, поэтому многие из этих других решений не работают.
У меня тоже была эта проблема, но я ее решил. Вы должны установить следующие значения:
CultureInfo.DefaultThreadCurrentCulture = "en-GB";
CultureInfo.DefaultThreadCurrentUICulture = "en-GB";
Я часами пытался найти решение для моего случая. Я работаю под Win10 (английская версия), но с русскими региональными настройками. Тем не менее в моем приложении появилась культура en-US, размещенная на IIS с ApplicationPoolIdentity. Это решило проблему:
IIS -> Application Pools -> Advanced Settings -> Change "Load User Profile" to False
Просто чтобы помочь кому-то становится та же проблема....
После попытки изменить IIS Культуру, установить глобализацию и до сих пор безуспешно, я сделал это в Global.asax:
void Application_BeginRequest(Object sender, EventArgs e)
{
System.Globalization.CultureInfo newCulture = (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
newCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
newCulture.DateTimeFormat.DateSeparator = "/";
System.Threading.Thread.CurrentThread.CurrentCulture = newCulture;
}