I want my client method HandleMessage
work with all types implements IMessage
, so I did as follows, but my HandleMessage method has never get hit. Should I only use concrete type parameter in Hub.On<T>
events?
Signalr Client
Hub = Connection.CreateHubProxy("Test");
Hub.On<IMessage>("ReceiveMessage", (payload) => HandleMessage(payload));
await Connection.Start();
Signalr Server
public static async Task BroadCast(Payload payload)
{
try
{
var user = UserHandler.UserList.Find(x => x.UserId == payload.CustomerId.ToString());
if (user != null)
{
await SendRelatedPayload(payload, user);
}
}
catch (Exception ex)
{
}
}
private static async Task SendRelatedPayload(Payload payload, UserConnection user)
{
string[] data = payload.MessageContent.Split('|');
switch (payload.MessageType)
{
case (short)MessageType.Order:
IMessage order = new Order
{
CustomerId = data[0],
OrderId = data[1],
OrderStatus = data[2],
};
await context.Clients.Client(user.ConnectionId).ReceiveMessage(order);
break;
case (short)MessageType.Accrual:
IMessage accrual = new Accrual
{
CustomerId = data[0],
OrderId = data[1],
Nominal = data[2],
Price = data[3],
};
await context.Clients.Client(user.ConnectionId).ReceiveMessage(accrual);
break;
}
}
Types
public interface IMessage
{
string CustomerId { get; set; }
}
public class Accrual : IMessage
{
public string OrderId { get; set; }
public string Price { get; set; }
public string Nominal { get; set; }
public string CustomerId { get; set; }
}
public class Order : IMessage
{
public string OrderId { get; set; }
public string OrderStatus { get; set; }
public string CustomerId { get; set; }
}
I think that SignalR supports only Concrete type method handlers, you need to add specific events for each type.
Thanks.