Signalr net client On event generic type parameter

1k Views Asked by At

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; }
}
1

There are 1 best solutions below

2
On

I think that SignalR supports only Concrete type method handlers, you need to add specific events for each type.

Thanks.