Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

Это альтернативные места, где вы могли бы искать:

Я не могу найти нигде, что настройки культуры для "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 требуемого сервера или настроить хост файлов на клиентском компьютере.

Ответ 2

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

Ответ 3

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

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

Ответ 5

. Сетевое приложение 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();
        }
    }

Ответ 6

В моем случае мой пул приложений работал как пользователь моего домена, для которого текущая культура была настроена на en-GB, и приложение работало нормально с форматом даты en-GB.

Вместо этого я изменил пул приложений для запуска в сетевой службе, и внезапно перестали работать вызовы DateTime.Parse, поскольку приложение теперь использовало англо-американскую культуру. Я видел некоторые SO сообщения (например) о том, как культуры IIS зависят от пользователя, что объясняет это.

Открытие .NET Globalization для корневого элемента в IIS Manager и настройка и Culture и UI Culture на English UK (en-GB) исправили это для меня.

Ответ 7

Просто, чтобы помочь кому-то получить ту же проблему....

После попытки изменить IIS Culture, установите глобализацию и до сих пор не обязательно, я сделал это в 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;
} 

Ответ 8

Я часами пытался найти решение для моего случая. Я работаю под Win10 (английская версия), но с русскими региональными настройками. Тем не менее в моем приложении появилась культура en-US, размещенная на IIS с ApplicationPoolIdentity. Это решило проблему:

IIS → Application Pools → Advanced Settings → Change "Load User Profile" to False