避免将DateTime转换传递给AspNetCore.SignalR .Net客户端

时间:2018-10-12 14:22:02

标签: asp.net-core signalr datetime-format signalr.client asp.net-core-signalr

我正在尝试将请求从服务器发送到客户端(.Net),该客户端在特定于文化的环境中运行,这会影响日期处于特殊时区。

我正在使用未指定的类型从服务器发送日期,以避免在客户端检索到该日期时将其转换。基本上我只是在服务器端这样转换它:

DateTime dateToSend = DateTime.SpecifyKind(serverSideDate, DateTimeKind.Unspecified);

问题是,当对客户端使用 JsonProtocol 时,日期未得到转换并且得到了正确的处理,而对于 MessagePackProtocol 来说,客户端和服务器端的代码相同完全不同的工作方式-它将日期转换为客户端上特定于文化的时区...

如何避免这种转换,而没有一些黑客解决方案,例如将日期作为字符串传递。

更新:
正如Shaun所建议的那样,我已经通过这种方式在客户端和服务器端都配置了MessagePack,但不幸的是,它仍然无法正常工作:

.AddMessagePackProtocol(options =>
    options.FormatterResolvers = new List<MessagePack.IFormatterResolver>()
    {
        StandardResolver.Instance,
        NativeDateTimeResolver.Instance
    })

1 个答案:

答案 0 :(得分:3)

问题是kind is lost with the MessagePackProtocol

  

DateTime被序列化为MessagePack时间戳格式,它序列化/反序列化UTC并丢失Kind信息。

该注释继续说明我们可以使用NativeDateTimeResolver来更改它(尽管有一些限制)。

  

如果您使用NativeDateTimeResolver序列化的本机DateTime二进制格式,它可以保留Kind信息,但不能与其他平台进行通信。

正如Chris和Panagiotis所提到的,最好使用DateTimeOffset。官方Microsoft documentation says this

  

DateTimeOffset应该被视为应用程序开发的默认日期和时间类型。

Stack DateTime vs DateTimeOffset上还有很多有用的信息。