【问题标题】:Override DateTime serialization for ASP.NET WebMethod parameters覆盖 ASP.NET WebMethod 参数的 DateTime 序列化
【发布时间】:2008-12-01 17:00:12
【问题描述】:

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

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

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

这样的事情可能吗?还是有其他更简单的方法来做我想做的事?

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

更新:另一种可能性是,如果可以在客户端 .NET 代码上进行更改,以改变类型为“未定义”的 DateTime 对象的序列化方式。

【问题讨论】:

    标签: asp.net web-services


    【解决方案1】:

    我经常在许多应用程序、服务和不同平台(.NET、Java 等)上处理这个问题。请相信我,您不希望假装您不关心时区的长期后果。在追逐了许多极其困难且修复成本高昂的错误之后,您会希望自己在意。

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

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

    如果您现在正确地修复它,它会变得简单且便宜。如果你故意进一步打破它,因为你认为这样会更便宜,那么当你必须解开这个可怕的烂摊子时,你就没有任何借口了。

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

    【讨论】:

    • 不,我们要剥离时区信息。我们无权访问客户端安装,由于许多不同的应用程序访问数据,我们无法将预先存在的数据库数据更改为 UTC 时间。如果有人从日期选择项中选择了 7 月 1 日,我们不能将它作为 6 月 30 日送到服务器。
    • 仍然不需要反对票。答案在问题范围内是合法的(问题没有指定限制)。
    • -1 这根本不是他问题的答案,你是在对他的项目细节做出假设。
    • @Element 和@Clyde:我只是想通过根据丰富的经验指出您的假设来为您省去一些麻烦。简单地说,忽略时区会回来咬你:这只是一个多快和多痛苦的问题。你已经被警告了,我不会再浪费我的时间了。
    【解决方案2】:

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

    <XmlElement(DataType:="date")> 
    

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

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

    【讨论】:

    • 请注意,您没有删除时间信息,只是将其归零,这可能会扭曲您的数据并产生细微的错误。然而,这是你的风险,它将成为你的问题。你问,我们警告。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2016-01-16
      • 2019-05-15
      • 1970-01-01
      • 2012-05-18
      • 2015-03-04
      • 2012-02-05
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      相关资源
      最近更新 更多