【问题标题】:SignalR MessagePack PolymorphismSignalR MessagePack 多态性
【发布时间】: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


【解决方案1】:

目前 SignalR 不支持 MessagePack 的多态性,更多信息here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多