Je viens de migrer environ 100 sites ASP.net de IIS 6 sous Windows Server 2003 vers IIS 7 sous Windows 2008. Je viens de remarquer que divers éléments de code utilisant des éléments tels que DateTime.Parse ont commencé à corriger des erreurs "La chaîne n’a pas été reconnue comme un DateTime valide". Je suis parvenu au fait que la CurrentCulture des sites est définie par défaut sur «en-US», de sorte que mes utilisateurs britanniques saisissent des dates dans un format inattendu.
La question est: d'où viennent-ils aux États-Unis? En partant du haut, si je regarde dans "Panneau de configuration> Région et langue", tout est réglé sur Anglais (Royaume-Uni). Les web.configs des sites ne comportent pas de section <globalisation> ou sont définis comme <globalisation culture = "auto" uiCulture = "auto" />. Dans 'IIS7 -. Global Globalization', la culture de tous les sites est définie sur 'Langue invariante (pays invariant)'.
Je ne trouve aucun endroit définissant la culture «en-US» ... mais quelque chose ne va pas.
Thread.CurrentThread.CurrentCulture.Name is outputting 'en-US'
Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencySymbol is outputting '$'
Je peux résoudre le problème en ajoutant <globalisation culture = "en-GB" uiCulture = "en-GB" /> à chaque web.config MAIS je ne veux vraiment pas avoir à éditer à la main environ 100 web.configs! Je ne souhaite pas hériter la culture des paramètres du système d'exploitation du serveur, qui sont définis sur en-GB.
Est-ce que je manque quelque chose?
Ce sont des endroits alternatifs où vous pourriez rechercher:
Je ne trouve aucun endroit définissant la culture «en-US» ... mais quelque chose ne va pas.
Thread.CurrentThread.CurrentCulture.Name renvoie 'en-US' Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencySymbol est en sortie de '$'
Essayez de rechercher la méthode InitializeCulture
, cette méthode est remplacée dans les pages ASP.Net pour définir la culture comme suit:
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();
}
Essayez de rechercher les attributs d'assembly suivants:
[Assembly: AssemblyCulture("en-US")]
[Assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.MainAssembly)]
Essayez de rechercher les attributs de directive de page suivants:
<%@ Page Culture="en-US" UICulture="en-US" Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
Essayez de regarder dans web.configs:
<globalization uiCulture="en-US" culture="en-US" enableClientBasedCulture="false" />
Essayez de chercher HttpHandlers ou HttpModules en essayant de définir la langue
Essayez de regarder dans la hiérarchie web.config (sur le serveur, <wwwroot>
signifie le dossier racine de votre site Web 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
Si vous avez plusieurs serveurs (ferme Web), vérifiez que vous êtes redirigé vers le bon serveur (celui dont vous vérifiez la configuration). Pour ce faire, vous pouvez utiliser l'adresse IP du serveur souhaité ou configurer vos fichiers hôte dans votre système. ordinateur client
Si j'ajoute une section de globalisation dans la racine web.config (windir\Microsoft.NET\Framework\ver\Config\Web.config), définie sur en-GB, cela résout mon problème et se propage jusqu'aux autres sites. Ce qui résout un peu mon problème. N'explique toujours pas d'où il provient en-US par défaut, mais cela devrait suffire. Merci.
J'ai eu le même problème et après de nombreuses heures, j'ai découvert que même si les paramètres régionaux étaient corrects, je devais également modifier la culture d'origine pour tous les comptes réservés (par exemple ASP.NET).
Pour ce faire, utilisez le bouton "Paramètres de copie ..." sous l'onglet Administratif dans Paramètres régionaux. Les paramètres sont copiés si vous cochez la case "Écran d'accueil et comptes système".
Cela peut provenir de la culture d'un compte système utilisé pour exécuter le pool d'applications ou l'application Web.
Vérifiez ce lien: différents paramètres de culture entre IIS et ASP.NET
L'application Web .Net détecte la culture par défaut de votre navigateur. Par exemple En FF, la langue par défaut est définie comme indiqué dans l'image ci-dessous.
Donc, si vous voulez que la culture de votre site autre que celle du navigateur, utilisez la méthode InitializeCulture de la page (créez une page de base et conservez le code ci-dessous ici et héritez des pages existantes de cette page de base).
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();
}
}
Dans mon cas, mon pool d'applications s'exécutait en tant qu'utilisateur de mon domaine, la culture actuelle étant définie sur en-GB, et l'application fonctionnait correctement avec le format de date en-GB.
J'ai changé le pool d'applications pour qu'il soit exécuté sous le service réseau à la place et soudain, les appels DateTime.Parse se sont interrompus, car l'application utilisait maintenant la culture en-US. J'ai vu quelques SO messages ( par exemple ) sur la façon dont les cultures IIS sont spécifiques à l'utilisateur, ce qui explique cela.
L'ouverture de .NET La globalisation de l'élément racine dans IIS Manager et la définition de Culture et UI Culture sur English UK (en-GB) m'ont résolu le problème.
Juste pour aider quelqu'un à avoir le même problème ....
Après avoir essayé le changement IIS Culture, définition de la mondialisation et sans succès jusqu'à présent, je l'ai fait dans 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;
}