在ASP.NET Web应用程序请求期间,文化莫名其妙地改变

时间:2009-04-21 18:06:15

标签: c# asp.net sql-server-2005

当日期字段的日期格式从4/16/2009 12:00:00 AM变为16/04/2009 00:00:00时,我遇到了一个奇怪的问题。我将应用程序设置为写出每个使用相同的相应日期字段触发的存储过程(如果存在)。这是出来的。你会注意到格式切换中途莫名其妙。

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 

我无法弄清楚原因。我正在使用ASP.NET / C#,SQL Server 2005和MS Enterprise Library 4.1。

更新1

我检查了应用程序的文化设置并得到了这个。对于每个日期字段查询,我检查了文化。在下面的屏幕截图中,您可以看到文化从美国到英国的变化:

image of cuture changing http://www.craigmoliver.com/cultureissue.jpg

web.config中的设置如下:

<globalization culture="en-US" uiCulture="en-US" requestEncoding="utf-8" responseEncoding="utf-8" enableClientBasedCulture="false" />

7 个答案:

答案 0 :(得分:4)

请求来自不同的浏览器吗?您是否从HTTP请求中的Accept-Language标头中获取Culture / UICulture?如果是这样,您可能有一个浏览器将其首选语言设置为en-US而另一个设置为en-GB?

答案 1 :(得分:3)

检查当前文化的建议很有希望。

还有一个可能需要考虑的可能性:您的应用程序是否在负载平衡的服务器场中运行,并且Web服务器的配置是否相同?

答案 2 :(得分:1)

创建一个在Thread.CurrentThread.CurrentCulture更改时触发的断点。这至少应该指向正确的方向。

答案 3 :(得分:1)

如果您正在使用从XSD架构生成的DataSet(DataSet.ReadXmlSchema方法),并且XSD包含msdata:Locale属性,则此DataSet上与文化相关的操作可能会使用架构中的区域设置,忽略Web .config设置。 为当前线程显式设置它然后再次覆盖XSD中的语言环境。

我曾经在奇怪的语言环境切换相关问题上丢失了几个小时,结果证明这是原因。

类似的东西也可能隐藏在企业库配置文件中。 我还建议在所有与项目相关的文件中搜索有问题的语言环境字符串(en-UK)。也许会出现一些有趣的事情。

答案 4 :(得分:0)

在我执行“Convert.ToDate”的方法中,我将以下代码放在:

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

仍然不知道为什么这样做。我的机器和开发服务器上的默认文化是en-US。

这令人抓狂!

答案 5 :(得分:0)

这是在单个页面的生命周期中还是在多个页面中发生的?如果它跨越多个页面,您还应该检查应用程序中每个页面的标记中的@Page指令 - 您可以在那里明确设置文化和UI文化。也许你有一个流氓页面,文化设置不正确。

答案 6 :(得分:0)

您还可以检查程序是否使用SET DATEFORMAT语句。在SQL Server中,可以在过程的上下文中更改日期值的解释,以便数据库以不同方式分析日期。以下代码

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

在我的电脑上返回以下结果

2009-04-01
2009-01-04
因此,SQL Server将以不同的方式将字符串值解释为