繁体   English   中英

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

[英]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
    })

问题是MessagePackProtocol丢失了那种

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM