在将日期时间传递给 AspNetCore.SignalR .Net 客户端时避免日期时间转换

Gri*_*tem 3 msgpack signalr signalr.client asp.net-core asp.net-core-signalr

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

我从服务器发送未指定类型的日期,以避免在客户端检索时对其进行转换。基本上我只是在服务器端像这样转换它:

DateTime dateToSend = DateTime.SpecifyKind(serverSideDate, DateTimeKind.Unspecified);
Run Code Online (Sandbox Code Playgroud)

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

如何防止这种转换,而不需要一些黑客解决方案,例如将日期作为字符串传递。

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

.AddMessagePackProtocol(options =>
    options.FormatterResolvers = new List<MessagePack.IFormatterResolver>()
    {
        StandardResolver.Instance,
        NativeDateTimeResolver.Instance
    })
Run Code Online (Sandbox Code Playgroud)

Sha*_*tin 6

问题是MessagePackProtocol 丢失了这种类型

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

该注释继续说我们可以通过使用来改变这一点NativeDateTimeResolver(尽管有一些限制)。

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

正如 Chris 和 Panagiotis 提到的,最好使用DateTimeOffset. 微软官方文档是这样说的:

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

StackOverflow 上还有很多有用的信息比较DateTime 与 DateTimeOffset

  • 感谢您的回答,我已经尝试过这种方法,但由于某种原因它不起作用......刚刚更新了与之相关的问题。 (2认同)