DateTime возвращается неправильно из WCF;по-прежнему правильно отображается в Front-end - PullRequest
0 голосов
/ 16 октября 2019

Мы внедряем новые серверы для запуска наших WCF и столкнулись с ... необычной проблемой на наших текущих производственных серверах.

TLDR ;

Что-то в наших серверах WCF и Front-end заставляет их сдвигаться DateTime s, хранящихся в базах данных назад и вперед . Пожалуйста, помогите мне узнать что .


У нас есть дата / время, заполненное в таблице / столбце SQL Server 2016, например:

(DataAgendamento обозначает «Дата планирования»)

Correct database value

Хранимая процедура возвращает его правильно;WCF нет. По какой-то странной причине возвращаемое значение представляет собой сдвинутое на час время назад : Current WCF Server returning wrong value

Все еще страннее: наше интерфейсное приложение (работающее в ASP.NETWebForms в .NET Framework 4.0) получает это значение от WCF и ... добавляет час назад. Итак, в итоге у нас отображается значение «правильно».

Ни один из проектов, WCF или Front end не имеет.AddHour в коде. Проверено несколько раз.

Несколько замечаний:

  1. И WCF, и Front-end в настоящее время работают на разных физических машинах Windows Server 2016,
  2. Оба IIS имеют параметр глобализации с португальским BR.
  3. Хранимые процедуры выполняются на уровне WCF и полностью возвращаются как DataTable с. Его данные не подвергаются какому-либо преобразованию, синтаксическому анализу, ToString ing в WCF. Front-end делает это, но значения неверны до того, как такие обработки вступят в силу.
  4. Не уверен, если связаны: Впервые за тридцать пять лет мы столкнемся с летом без наш обычный график перехода на летнее время (который обычно длится с ноября по середину февраля).
  5. Это поведение было обнаружено в нескольких различных методах (и процедурах).
  6. Кодчтобы отобразить DateTime на Convert.ToDateTime(dataRow[0]["DataAgendamentoFinal"]).ToString("mm") на изображении выше.
  7. Этот сценарий "ошибка / не ошибка" работает сейчас , но на новых серверах WCF этот параметр не включен (какой бы он ни был), поэтому он возвращает DateTime (на самом деле) правильно, только для добавления часа к результату во внешнем интерфейсе.
  8. Серверы базы данных, WCF и интерфейсные серверы работают в одном часовом поясе (GMT-3)Бразилиа) (Спасибо, @Sooryan). Этот часовой пояс не учитывает летнее время.

Любые указатели будут с благодарностью.

1 Ответ

0 голосов
/ 17 октября 2019

Когда WCF вызывается в разных часовых поясах (WCF на стороне сервера и на стороне клиента не находятся в одном часовом поясе), WCF автоматически преобразует время, полученное с сервера, в локальное время клиента. В качестве распределенной среды целесообразно, чтобы WCF осуществлял это преобразование. Но иногда бизнес-логике может не потребоваться такое преобразование времени, мы можем изменить поле DateTime на строку (преобразовать в строку на стороне сервера), что может избежать проблемы автоматического преобразования времени. Или используйте время UTC. Вот некоторые обсуждения на эту тему.
WCF автоматически конвертирует время на основе часового пояса
https://social.msdn.microsoft.com/Forums/en-US/36ae825a-ffc6-4ac3-9981-c82692039d58/wcf-is-translating-my-datetime-values-across-different-time-zones?forum=wcf
https://social.msdn.microsoft.com/Forums/office/en-US/a63d0409-a8ec-4a83-8c82-f6c39356d96e/disabling-automatic-time-conversion-in-wcf?forum=wcf
Не стесняйтесь сообщать мне, есть ли что-то, что яможет помочь.

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