为什么我在 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() { }
}
我在 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() { }
}