веб-служба delphi получает другое datetime from.net приложение mvc

Я знаю, что решение, которое большинство предложит, - это изменить свойства моих объектов с TDateTime на String, но у меня нет доступа ко всему исходному коду для приложения веб-службы, поэтому есть случаи, когда я не могу этого сделать. Так что я лучше позабочусь об этом.

вкратце, у меня есть приложение .NET MVC, которое вызывает веб-метод приложения-службы, написанный в Delphi 2005, чтобы получить объект встречи, включая дату начала / время и конец дата-время. Пользователь может внести изменения в встречу, затем приложение MVC вызывает другой веб-метод, передавая измененный объект встречи для хранения приложения-службы.

свойства StartTime и EndTime TAppointemnt определены в Delphi как TDateTime. Они отображаются в WSDL как xs: dateTime. Visual Studio создает их как систему.DateTime в ссылке.цезий.

С помощью отладчика веб-приложений в Delphi и установки конечных точек приложения MVC для веб-службы EXE я могу пройти через оба приложения в режиме реального времени. Я вижу, что свойства StartTime и EndTime отправленных и полученных объектов назначения одинаковы при передаче из веб-службы в .NET MVC, но время настраивается на 13 часов при передаче из .NET MVC в веб-службу Delphi.

хотя я понимаю, что .NET выполняет некоторые внутренние настройки часового пояса, это должно быть видно только тогда, когда клиент и сервер находятся в разных часовой пояс. В моем случае браузер клиента, приложение .NET MVC и приложение Службы Delphi находятся в одном и том же. На самом деле, все они работают на одной машине, поэтому я не понимаю, почему разница.

похоже, что они кодируют даты в XML по-разному...

ответ из приложения Службы Delphi на приложение .NET MVC:

<StartTime xsi:type="xsd:dateTime">2012-10-29T08:00:00.000+13:00</StartTime><EndTime xsi:type="xsd:dateTime">2012-10-29T09:15:00.000+13:00</EndTime>

сообщение из приложения .NET MVC в приложение Delphi service:

<StartTime xsi:type="xsd:dateTime">2012-10-29T08:00:00</StartTime><EndTime xsi:type="xsd:dateTime">2012-10-29T09:15:00</EndTime>

1 ответов


Я нашел решение, которое работает для меня.

в моей модели, где я обрабатываю обновление для встречи, мне передается объект встречи, созданный компонентом view, который не включает все свойства. Только на вид. Чтобы завершить встречу, я получаю неизмененную версию из приложения-службы и изменяю ее свойства на основе нового объекта.

то, что я нашел при отладке, было то, что свойства StartTime и EndTime wsappointment, извлеченный из приложения-службы, имел DateTimeKind Local, в то время как StartTime и EndTime параметра pAppointment были установлены в Unspecified. Таким образом, локальный DateTimeKind, который я передавал обратно в приложение-службу, был перезаписан с неопределенным.

чтобы исправить это, я использовал DateTime.SpecifyKind явно задать свойство Kind, следующим образом:

wsAppointment.StartTime = DateTime.SpecifyKind(pAppointment.StartTime, DateTimeKind.Local);
wsAppointment.EndTime = DateTime.SpecifyKind(pAppointment.EndTime, DateTimeKind.Local);

надеюсь, это поможет другим, которые испытывают то же самое или подобное проблемы.