C # Изменение значения Datetime при входе в метод api стека обслуживания

#c# #datetime #serialization #servicestack

#c# #datetime #сериализация #servicestack

Вопрос:

Мы используем ServiceStack для наших веб-сервисов, но мы заметили, что любой объект DateTime в запросе DTO изменяется. Часы меняются в зависимости от смещения часового пояса сервера. Допустим, я отправляю запрос с восточного времени на сервер, на котором размещен ServiceStack api в горном часовом поясе, он меняет дату на два часа, как только наш метод api получает запрос.

Я пытался найти, как изменить десериализацию значения datetime с помощью ServiceStack, чтобы предотвратить это, и пока не нашел никакого элегантного решения. Я подумал, что, сделав ServiceStack.Text.JsConfig.AssumeUtc = true; это, это будет обрабатывать любое значение datetime, поступающее на сервер, как UTC, а не преобразовывать в datetime с каким-то локальным значением. Похоже, это не влияет на поступающие даты.

Я пытался использовать ServiceStack.Text.JsConfig<DateTime>.DeSerializeFn для изменения строки на datetime, но для этого требуется удалить всю информацию, кроме информации о тике datetime.

Я упускаю что-то очевидное в этом? Похоже, должен быть более простой способ предотвратить такое поведение.

Комментарии:

1. Как выглядят значения по проводам? Я предполагаю, что они находятся в формате ISO601, но имеют ли они конечный Z или смещение? Примерное значение было бы полезно.

Ответ №1:

Скорее всего, вы захотите использовать это вместо:

 JsConfig.AlwaysUseUtc = true;
  

Комментарии:

1. Это полезно, и мне нужно будет запомнить это для последующего использования, потому что я хочу переключиться на использование UTC во всем нашем коде, но пока я должен придерживаться того, как он отправляет без UTC. Я внес изменения и теперь сохраняю фактическое время, но в формате UTC. Мне было интересно, есть ли какой-либо способ сохранить datetime со значением из того, что оно было отправлено, без преобразования его в UTC. Главным образом потому, что значения datetime используются для фильтрации на основе дат для возврата наборов результатов, а даты, хранящиеся в базе данных, не являются UTC.

2. @user1568610 Нет, он всегда сериализуется в UTC по умолчанию и по умолчанию десериализует его по местному времени, но может быть сохранен как UTC с указанным выше параметром конфигурации.

3. Хорошо, спасибо за помощь и информацию. Я просто буду придерживаться пользовательской десериализации, пока не смогу обновить код для использования UTC.