Культура необъяснимо меняется во время запроса веб-приложения ASP.NET - PullRequest
3 голосов
/ 21 апреля 2009

У меня странная проблема, когда формат даты из полей даты меняется с 16.04.2009 12:00:00 на 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

Я проверил настройки культуры приложения и получил это. Для каждого запроса поля даты я проверял культуру. На снимке экрана ниже вы можете увидеть, как культура меняется от США к Великобритании:

изображение изменения выреза http://www.craigmoliver.com/cultureissue.jpg

Параметр в файле web.config установлен следующим образом:

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

Ответы [ 7 ]

4 голосов
/ 21 апреля 2009

Запросы поступают из разных браузеров? Вы выбираете Культуру / UICulture из заголовка Accept-Language в HTTP-запросе? Если это так, возможно, у вас есть один браузер, для которого предпочитаемый язык установлен в en-US, а в другом - en-GB?

3 голосов
/ 21 апреля 2009

Предложения по проверке текущей культуры многообещающие.

Еще одна возможность рассмотреть: работает ли ваше приложение в ферме серверов с балансировкой нагрузки и правильно ли настроены веб-серверы?

1 голос
/ 04 мая 2009

Если вы используете наборы данных, сгенерированные из схем XSD (метод DataSet.ReadXmlSchema), а XSD содержит атрибут msdata:Locale, зависящие от культуры операции с этим набором данных могут использовать языковой стандарт из схемы, игнорируя параметры web.config. Явно устанавливая его для текущего потока, затем снова переопределяем локаль из XSD.

Однажды я потерял несколько часов из-за странных проблем, связанных с переключением локали, и это оказалось причиной.

Может быть, что-то подобное может также скрыться в файлах конфигурации Enterprise Library. Я также рекомендовал бы поискать во всех файлах, связанных с проектом, неправильную строку локали (en-UK). Может быть, что-то интересное придет.

1 голос
/ 30 апреля 2009

Создать точку останова, которая срабатывает при каждом изменении Thread.CurrentThread.CurrentCulture. Это должно, по крайней мере, указать вам правильное направление.

0 голосов
/ 07 мая 2009

Вы также можете проверить в своих процедурах использование оператора 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 будет интерпретировать строковые значения как даты по-разному

0 голосов
/ 06 мая 2009

Это происходит в течение жизненного цикла одной страницы или нескольких страниц? Если это на нескольких страницах, вы также должны проверить директивы @Page в разметке для каждой страницы в вашем приложении - вы можете явно установить там культуру и культуру интерфейса. Может быть, у вас есть одна мошенническая страница с неправильно заданной культурой.

0 голосов
/ 22 апреля 2009

В методах, где я выполнил «Convert.ToDate», я вставил следующий код:

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

Все еще не знаю, ПОЧЕМУ он это делает. По умолчанию на моей машине и на сервере разработки используется en-US.

Это сводит с ума!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...