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.
Я что-то пропустил?
Ответы
Ответ 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).
Это делается с помощью кнопки "Параметры копирования..." на вкладке "Администратор" в разделе "Региональные настройки". Настройки будут скопированы, если вы установите флажок "Экран приветствия и системные учетные записи".
Ответ 4
Это может происходить из культуры системной учетной записи, используемой для запуска пула приложений или веб-приложения.
Проверьте эту ссылку:
различные настройки культуры между IIS и 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