我知道大多数建议的解决方案是将我的对象的属性从TDateTime更改为String,但我无法访问Web服务应用程序的所有源代码,因此有些情况下我不能这样做。所以我宁愿确保我处理这个问题。
简单地说,我有一个.NET MVC应用程序,它调用Delphi 2005编写的服务应用程序的Web方法来获取约会对象,包括开始日期/时间和结束日期/时间。用户可以更改约会,然后MVC应用程序调用另一个Web方法,传入修改后的约会对象,以便服务应用程序存储。
TAppointemnt的StartTime和EndTime属性在Delphi中定义为TDateTime。它们在WSDL中显示为xs:dateTime。 Visual Studio在Reference.cs中将它们创建为System.DateTime。
通过在Delphi中使用Web App Debugger,并将MVC应用程序的端点设置为Web服务EXE,我可以实时浏览这两个应用程序。我所看到的是,当从Web服务传递到.NET MVC时,发送和接收的约会对象的StartTime和EndTime属性是相同的,但是当从.NET MVC传递到Delphi时,时间调整了13个小时网络服务。
虽然我理解.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服务应用程序的POST:
<StartTime xsi:type="xsd:dateTime">2012-10-29T08:00:00</StartTime><EndTime xsi:type="xsd:dateTime">2012-10-29T09:15:00</EndTime>
答案 0 :(得分:6)
我找到了一个适合我的解决方案。
在我处理约会更新的模型中,我传递了一个由视图组件生成的约会对象,该对象不包含所有属性。只有那些观点。要完成约会,我从服务应用程序获取未更改的版本,并根据新对象修改其属性。
我在调试时发现,从服务应用程序检索到的wsAppointment的StartTime和EndTime属性的DateTimeKind为Local,而pAppointment参数的StartTime和EndTime设置为Unspecified。因此,我传回服务应用程序的Local DateTimeKind正在被Unspecified覆盖。
为了解决这个问题,我使用DateTime.SpecifyKind来显式设置Kind属性,如下所示:
wsAppointment.StartTime = DateTime.SpecifyKind(pAppointment.StartTime, DateTimeKind.Local);
wsAppointment.EndTime = DateTime.SpecifyKind(pAppointment.EndTime, DateTimeKind.Local);
希望这可以帮助遇到相同或类似问题的其他人。