为什么我在 SignalR 上收不到以复杂对象作为参数的事件?

Why I don't receive event on SignalR with complex object as parameters?

我在 SignalR 中有一个事件未到达,而其他事件已到达。

发送代码:

IHubContext<IServerHubProxy> _hubContext=...
MyClass message1 = new MyClass ();
MyClass message2 = new MyClass () { new MyMessage(Guid.NewGuid(), 0, 1), new MyMessage(Guid.NewGuid(), 1, 1) };
await _hubContext.Clients.All.SendMessage(message1);
await _hubContext.Clients.All.SendMessage(message2);
await _hubContext.Clients.All.SendSimpleMessage("Hello");

接收码:

IClientHubProxy _hubTypedProxy=...
_hubTypedProxy.SendMessage(args => {
    Console.WriteLine("Messages received: {0} {1}", args.Messages.Count, string.Join(",", args.Messages));
});
_hubTypedProxy.SendSimpleMessage(args => {
    Console.WriteLine("Message received: {0}", args));
});

IServerHubProxy

public interface IServerHubProxy
{
    Task SendMessage(MyClass message);
    Task SendSimpleMessage(string message);
}

IClientHubProxy

public interface IClientHubProxy: IClientHubProxyBase
{
    IDisposable SendMessage(Action<MyClass> messageHandler);
    IDisposable SendSimpleMessage(Action<string> messageHandler);
}

MyClass

[DataContract]
public class MyClass
{
    [DataMember]
    public List<MyMessage> Messages { get; set; }

    public MyClass()
    {
        Messages = new List<MyMessage>();
    }
}

我的消息

[DataContract]
public class MyMessage : MyMessageBase
{
    [DataMember]
    public Guid MessageID { get; set; }

    public MyMessage(Guid messageId, int messageType, int enabled)
        : base(messageType, enabled)
    {
        MessageID = messageId;
    }
}

MyMessageBase

[DataContract]
public class MyMessageBase
{
    [DataMember]
    public int MessageType { get; set; }
    [DataMember]
    public int Enabled { get; set; }

    public MyMessageBase(int messageType, int enabled)            
    {
        MessageType = messageType;
        Enabled = enabled;
    }
}

控制台结果:

Messages received: 0
Message received: Hello

预期结果:

Messages received: 0
Messages received: 2 MyMessage,MyMessage
Message received: Hello

经过几个小时的调试我发现:

  • 使用正确的消息(Json 格式)调用了 Receive 事件

所以 我模拟了 SignalR 完成的反序列化过程,以及从 Received 事件中获得的消息,最终我得到了

  • 一个异常表明我试图转换成的类型需要一个无参数构造函数

因此,解决此特定问题的方法是向要在要通过 SignalR 传输的消息中使用的任何对象添加 无参数构造函数

我的消息

[DataContract]
public class MyMessage : MyMessageBase
{
    [DataMember]
    public Guid MessageID { get; set; }

    public MyMessage(Guid messageId, int messageType, int enabled)
        : base(messageType, enabled)
    {
        MessageID = messageId;
    }

    public MyMessage() { }
}

MyMessageBase

[DataContract]
public class MyMessageBase
{
    [DataMember]
    public int MessageType { get; set; }
    [DataMember]
    public int Enabled { get; set; }

    public MyMessageBase(int messageType, int enabled)            
    {
        MessageType = messageType;
        Enabled = enabled;
    }
    public MyMessageBase() { }
}