CurrentCulture неправильно по умолчанию для en-US в ASP.net

Я только что перенес около 100 сайтов ASP.net из IIS 6 в Windows Sever 2003 в IIS 7 в Windows 2008. Я только что заметил, что различные фрагменты кода, использующие такие вещи, как DateTime.Parse, начали выдавать ошибки "Строка не была признан действительным DateTime". Я связал это с тем фактом, что текущая культура сайтов по умолчанию настроена на "en-US", и поэтому мои британские пользователи вводят даты в неожиданном формате.

Вопрос в том, откуда они попадают в США? Начиная сверху, если я смотрю в "Панель управления> Регион и язык", все настроено на английский (Великобритания). В web.configs сайтов либо нет раздела , либо он имеет значение . В "IIS7 - .Net Globalization" все сайты имеют свою культуру "Инвариантный язык (инвариантная страна)".

Я не могу найти где-нибудь, что настраивает культуру на "en-US"... но что-то есть.

Thread.CurrentThread.CurrentCulture.Name is outputting 'en-US'
Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencySymbol is outputting '$'

Я могу решить эту проблему, добавив к каждому web.config, НО я действительно не хочу вручную редактировать около 100 web.configs! Я не хочу наследовать культуру от настроек ОС сервера, которые установлены в en-GB.

Я что-то пропустил?

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)

  1. Глобальная машина. <windir>\Microsoft.NET\Framework\<ver>\Config\Machine.config
  2. Корневой веб-конфиг. <windir>\Microsoft.NET\Framework\<ver>\Config\Web.config
  3. Веб-сайт. <wwwroot>\Web.config
  4. Веб приложение. <wwwroot>\<webapp>\Web.config
  5. Папка. <wwwroot>\<webapp>\<dir>\Web.config

Если у вас есть несколько серверов (веб-ферма), убедитесь, что вы перенаправлены на правильный сервер (тот, на котором вы проверяете конфигурацию), чтобы сделать это, вы можете использовать ip нужного сервера или настроить файлы хоста в своем клиентский компьютер

У меня была та же проблема, и через много часов я обнаружил, что, хотя региональные настройки были правильными, мне также нужно было изменить исходную культуру для всех зарезервированных учетных записей (например, ASP.NET).

Это делается с помощью кнопки "Копировать настройки..." на вкладке " Администрирование " в региональных настройках. Настройки копируются, если вы включите флажок "Экран приветствия и системные учетные записи".

Если я добавлю раздел глобализации в корневой каталог web.config ( windir\Microsoft.NET\Framework\ver\Config\Web.config), установив en-GB, это решит мою проблему и распространится на другие сайты. Который вроде решает мою проблему. Тем не менее, он не объясняет, откуда он по умолчанию получает en-US, но это должно сработать. Благодарю.

Веб-приложение.Net использует культуру вашего браузера по умолчанию. Например, в FF язык по умолчанию установлен так, как показано на рисунке ниже. Настройки 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-GBlocale по умолчанию без необходимости устанавливать его в коде или в файле 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;
} 
Другие вопросы по тегам