【发布时间】:2021-02-10 14:41:04
【问题描述】:
我正在实现一个基于 SignalR 的系统,它将推送客户端事件,对于消息序列化,我想使用 MessagePack。在尝试实现消息传递时,我遇到了 SignalR 无法反序列化客户端上的消息的问题。
消息是多态的并使用 Union 属性进行描述,标准 MessagePack 序列化器在序列化和反序列化消息时没有问题,但在 Signal R 失败并出现错误的情况下。
报告的错误是System.InvalidOperationException: Invalid Union data was detected。
在客户端序列化仅在使用实际类时有效,如果我尝试使用接口或基类,则会出现错误。
类
[DataContract()]
[MessagePackObject()]
[Union(0,typeof(EntityChangeEventMessage))]
public abstract class EntityEventMessage : IEntityEventMessage
{
}
[DataContract()]
[MessagePackObject()]
public class EntityChangeEventMessage : EntityEventMessage
{
#region PROPERTIES
/// <summary>
/// Gets entity id.
/// </summary>
[DataMember(Order = 1)]
[Key(1)]
public int EntityId
{
get; set;
}
/// <summary>
/// Gets event type.
/// </summary>
/// <remarks>
/// This value identifies database operation such as create,delete,update etc.
/// </remarks>
[DataMember(Order = 2)]
[Key(2)]
public int EventType
{
get; set;
}
/// <summary>
/// Gets entity type name.
/// </summary>
[DataMember(Order = 3)]
[Key(3)]
public string EntityType
{
get; set;
}
#endregion
}
[Union(0,typeof(EntityChangeEventMessage))]
public interface IEntityEventMessage
{
}
所以这行得通
connection.On("EntityEvent", (EntityChangeEventMessage d)
这个不行
connection.On("EntityEvent", (IEntityEventMessaged)
所以总的来说,问题应该出在 Microsoft.AspNetCore.SignalR.Protocols.MessagePack 库中? 有人成功实现了这样的功能吗?
【问题讨论】:
-
这听起来像是你如何设置 SignalR 的问题,而不是你的数据类
-
我在 aspnet repo github.com/dotnet/aspnetcore/issues/30096 中发布了类似的问题,我认为问题出在 github.com/dotnet/aspnetcore/blob/… ,如果当前实现的信号集线器协议没有错,它不可能将多态性作为序列化程序序列化时将始终使用实际类型,从而省略任何联合数据。
标签: .net-5 asp.net-core-signalr msgpack signalrcore