La culture change de manière inexplicable lors de la demande d’application Web ASP.NET

J’ai un problème étrange lorsque le format de date des champs de date change du 16/04/2009 00h00 au 16/04/2009 00:00:00. Je règle l’application pour écrire chaque proc stocké qui a tiré avec le même champ de date correspondant s’il existe. Voici ce qui est sorti. Vous remarquerez que le changement de format est inexplicable à mi-parcours.

EXECUTE uspContent_SelectOne '132' 4/16/2009 12:00:00 AM EXECUTE uspContent_SelectOne '127' 4/16/2009 12:00:00 AM EXECUTE uspContent_SelectOne '133' 4/16/2009 12:00:00 AM EXECUTE uspContent_SelectOne '131' 4/16/2009 12:00:00 AM EXECUTE uspAttachment_SelectAll EXECUTE uspArticleAuthors_SelectAll_ArticleId '3' EXECUTE uspArticles_SelectOne '3' EXECUTE uspAuthors_Letters EXECUTE uspAuthors_Letters EXECUTE uspAuthors_Letters EXECUTE uspAuthors_SelectAll_Letter_LastName 'A' EXECUTE uspFiles_SelectAll_NoFileData EXECUTE uspArticles_SelectOne '3' EXECUTE uspArticleTypes_SelectAll EXECUTE uspFiles_SelectAll_NoFileData EXECUTE uspAuthors_SelectOne '0' EXECUTE uspArticleAttachments_SelectAll_ArticleId '3' EXECUTE uspArticleAttachments_SelectOne_ArticleId_AttachmentId '3','4' EXECUTE uspAttachment_SelectOne '4' EXECUTE uspContent_SelectOne '132' 16/04/2009 00:00:00 EXECUTE uspContent_SelectOne '127' 16/04/2009 00:00:00 EXECUTE uspFiles_SelectOne_NoFileData '60' EXECUTE uspArticleAttachments_SelectOne_ArticleId_AttachmentId '3','3' EXECUTE uspAttachment_SelectOne '3' EXECUTE uspContent_SelectOne '133' 16/04/2009 00:00:00 EXECUTE uspContent_SelectOne '131' 16/04/2009 00:00:00 EXECUTE uspAttachment_SelectAll EXECUTE uspArticleAuthors_SelectAll_ArticleId '3' EXECUTE uspAuthors_SelectAll_Letter_LastName 'A' EXECUTE uspContent_SelectOne '129' 18/09/2008 00:00:00 EXECUTE uspContent_SelectOne '7' 18/09/2008 00:00:00 EXECUTE uspContent_SelectOne '8' 18/09/2008 00:00:00 EXECUTE uspContent_SelectOne '9' 18/09/2008 00:00:00 EXECUTE uspContent_SelectOne '10' 18/09/2008 00:00:00 EXECUTE uspContent_SelectOne '11' 18/09/2008 00:00:00 EXECUTE uspFiles_SelectAll_NoFileData 

Je ne peux pas comprendre pourquoi. J’utilise ASP.NET/C#, SQL Server 2005 et MS Enterprise Library 4.1.

MISE À JOUR 1

J’ai vérifié les parameters de culture de l’application et obtenu ceci. Pour chaque requête de champ de date, j’ai vérifié la culture. Dans la capture d’écran ci-dessous, vous pouvez voir comment la culture change des États-Unis au Royaume-Uni:

image de changement de découpe http://soffr.miximages.com/c%23/cultureissue.jpg

Le paramètre dans le fichier web.config est défini comme suit:

  

Les demandes proviennent-elles de différents navigateurs? Récupérez-vous Culture / UICulture à partir de l’en-tête Accept-Language dans la requête HTTP? Si tel est le cas, il est possible que vous ayez un navigateur dont la langue préférée est définie sur en-US et un autre sur en-GB?

Les suggestions pour vérifier la culture actuelle sont prometteuses.

Une possibilité supplémentaire à considérer: votre application s’exécute-t-elle dans une batterie de serveurs à charge équilibrée et les serveurs Web sont-ils correctement configurés de manière identique?

Créez un point d’arrêt qui se déclenche chaque fois que Thread.CurrentThread.CurrentCulture modifié. Cela devrait au moins vous orienter dans la bonne direction.

Si vous utilisez des DataSets générés à partir de schémas XSD (méthode DataSet.ReadXmlSchema ) et que XSD contient un msdata:Locale , les opérations dépendant de la culture sur ce DataSet peuvent utiliser les parameters régionaux du schéma, en ignorant les parameters web.config. La définir explicitement pour le thread actuel, puis redéfinit les parameters régionaux à partir du fichier XSD.

Une fois, j’ai perdu quelques heures sur d’étranges problèmes liés à la commutation de parameters régionaux, ce qui s’est avéré être la raison.

Peut-être que quelque chose de similaire pourrait aussi se cacher dans les fichiers de configuration d’Enterprise Library. Je vous recommanderais également de rechercher la chaîne incriminée dans tous les fichiers liés au projet (en-UK). Peut-être que quelque chose d’intéressant se présente.

Dans les méthodes où j’ai effectué “Convert.ToDate”, j’ai inséré le code suivant:

 Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US"); 

Je ne sais toujours pas POURQUOI ça le fait. La culture par défaut sur ma machine et le serveur de développement est en-US.

C’est exaspérant!

Cela se produit-il pendant le cycle de vie d’une seule page ou sur plusieurs pages? S’il s’agit de plusieurs pages, vous devez également vérifier les directives @Page dans le balisage pour chaque page de votre application – vous pouvez y définir explicitement la culture et la culture de l’interface utilisateur. Peut-être que vous avez une page non autorisée avec la culture définie de manière incorrecte.

Vous pouvez également vérifier vos procédures d’utilisation de l’instruction SET DATEFORMAT. Dans SQL Server, il est possible de modifier l’interprétation des valeurs de date dans le contexte d’une procédure afin que la firebase database parsing les dates différemment. Le code suivant

 SET DATEFORMAT 'DMY'; SELECT CAST('1-4-2009' AS date); SET DATEFORMAT 'MDY'; SELECT CAST('1-4-2009' AS date); 

Renvoie les résultats suivants sur mon PC

 2009-04-01 2009-01-04 

SQL Server interprétera donc les valeurs de chaîne comme des dates différemment