[英]Avoiding DateTime conversion while passing it to AspNetCore.SignalR .Net client
我正在尝试将请求从服务器发送到客户端(.Net),该客户端在特定于文化的环境中运行,这会影响日期处于特殊时区。
我正在从服务器发送未指定类型的日期,以避免在客户端检索时将其转换。 基本上我只是在服务器端像这样转换它:
DateTime dateToSend = DateTime.SpecifyKind(serverSideDate, DateTimeKind.Unspecified);
问题是,当客户端使用JsonProtocol时,日期没有被转换并且被正确处理,而对于MessagePackProtocol ,客户端和服务器端的相同代码以完全不同的方式工作 - 它在客户端将日期转换为特定于文化的时区。 .
如何在没有一些黑客解决方案的情况下防止这种转换,例如将日期作为字符串传递。
更新:
正如肖恩所建议的那样,我已经在客户端和服务器端以这种方式配置了 MessagePack,但不幸的是它仍然无法正常工作:
.AddMessagePackProtocol(options =>
options.FormatterResolvers = new List<MessagePack.IFormatterResolver>()
{
StandardResolver.Instance,
NativeDateTimeResolver.Instance
})
DateTime
被序列化为MessagePack Timestamp格式,它对UTC进行序列化/反序列化,并丢失Kind
信息。
该注释继续说明我们可以通过使用NativeDateTimeResolver
来更改它(尽管有一些限制)。
如果使用
NativeDateTimeResolver
序列化了本机DateTime
二进制格式,则它可以保留Kind
信息,但不能与其他平台进行通信。
正如Chris和Panagiotis所提到的,最好使用DateTimeOffset
。 Microsoft的官方文档说 :
对于应用程序开发,应将DateTimeOffset视为默认日期和时间类型。
比较StackTime和DateTimeOffset时 ,StackOverflow上还有很多有用的信息。
这里解析器的顺序很重要。 如果像这样在StandardResolver
之前提供NativeDateTimeResolver
,问题将得到解决。
.AddMessagePackProtocol(options =>
options.FormatterResolvers = new List<MessagePack.IFormatterResolver>()
{
NativeDateTimeResolver.Instance,
StandardResolver.Instance
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.