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)
问题是MessagePackProtocol 丢失了这种类型。
DateTime序列化为 MessagePack Timestamp 格式,它序列化/反序列化 UTC 并丢失Kind信息。
该注释继续说我们可以通过使用来改变这一点NativeDateTimeResolver(尽管有一些限制)。
如果您使用
NativeDateTimeResolver序列化的本机DateTime二进制格式,它可以保留Kind信息但无法与其他平台通信。
正如 Chris 和 Panagiotis 提到的,最好使用DateTimeOffset. 微软官方文档是这样说的:
DateTimeOffset 应被视为应用程序开发的默认日期和时间类型。
StackOverflow 上还有很多有用的信息比较DateTime 与 DateTimeOffset。
| 归档时间: |
|
| 查看次数: |
2102 次 |
| 最近记录: |