简而言之,我有一个.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>
解决方法
在我的模型中,我处理对约会的更新,我传递了由视图组件生成的约会对象,该对象不包括所有属性.只有那些观点.要完成约会,我从服务应用程序获取未更改的版本,并根据新对象修改其属性.
我在调试时发现,从服务应用程序检索到的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);
希望这可以帮助遇到相同或类似问题的其他人.