覆盖ASP.NET WebMethod参数的DateTime序列化

时间:2008-12-01 17:00:13

标签: asp.net web-services

我正在努力清理大型代码库中的错误,其中没有人关注本地时间与UTC时间。

我们想要的是一种全局忽略发送到ASP.NET Web服务和从ASP.NET Web服务发送的DateTime对象的时区信息的方法。我有一个检索操作的解决方案。数据仅在数据集中返回,我可以查找DateTime列并将DateTimeMode设置为Unspecified。这解决了我在数据集内来回传递的所有数据的问题。

但是,DateTime对象也经常作为参数直接传递给Web方法。我想剥离任何传入的时区信息。而不是搜索我们的客户端代码并使用DateTime.SpecifyKind(..)将所有DateTime变量设置为Undefined,我想做一些全局ASP.NET覆盖来监视传入参数并去掉时区信息。

这样的事情可能吗?或者还有另一种更简单的方法来做我想做的事情吗?

重申 - 我不关心时区,每个人都处于同一时区。但是有几个用户的机器配置不当,时区错误等等。所以当他们在2008年7月1日发送时,我将在2008年6月30日22:00:00在服务器端自动转发它们本地时间到服务器的当地时间。

更新:另一种可能性是,如果可以在客户端.NET代码上进行更改,以改变使用Kind'Undefined'的DateTime对象的序列化方式。

3 个答案:

答案 0 :(得分:4)

我经常在许多应用程序,服务和不同平台(.NET,Java等)上处理这个问题。请相信我,你不希望假装你不关心时区的长期后果。在追逐许多非常难以修复的错误之后,你会希望得到你的关心。

因此,您应该捕获正确的时区或强制使用特定的时区,而不是剥离时区。如果您合理,可以修复各种数据源以提供正确的时区。如果它们不受您的控制,则强制它们到服务器的本地时区或UTC。

一般行业惯例是强制一切为UTC,并将所有生产硬件时钟设置为UTC(即服务器,网络设备,如路由器等)。然后,您应该在UI中转换为用户的本地时区。

如果你现在正确地修复它,它可以很容易和便宜。如果你因为认为会更便宜而故意进一步打破它,那么当你不得不解开可怕的混乱时,你将没有任何借口。

请注意,这与字符串的常见问题类似:没有纯文本(没有字符编码的字符串),也没有普通(无时区)时间/日期。假装不然是痛苦和心痛的根源,也是令人尴尬的错误。

答案 1 :(得分:2)

好的,我确实有一个解决方法,这取决于我实际上只需要DateTime的Date部分这一事实。我将此属性附加到系统中的每个Date或DateTime参数

<XmlElement(DataType:="date")> 

这会将生成的wsdl更改为类型s:date而不是s:dateTime。 (请注意,只是将.NET方法参数的类型设为Date而不是DateTime并未实现此目的)。所以客户端现在只发送DateTime的日期部分,没有时间信息,没有时区信息。

如果我需要向服务器发送日期和时间值,我将不得不使用其他一些解决方法,例如将其作为字符串参数。

答案 2 :(得分:1)

我也遇到过时区信息问题。问题是我已经提供了UTC的日期时间字段。然后发生序列化,本地偏移成为日期/时间的一部分。我们的供应商在不同时区的日期/时间非常混乱。我通过在我用来填充数据集的select语句中的datetime字段上使用tsql convert函数解决了这个问题。这将字段转换为字符串变量,该变量在客户端自动转换为日期时间值。如果您只想传递日期,则可以使用101代码仅提供日期。我使用126来提供它在数据库列中的确切显示日期和时间,并删除了时区信息。