Tomáš Filip
Tomáš Filip

Reputation: 817

SignalR hub not answering to object parameter

I cannot find any resource, that would say I cannot do that.

I have all setup hub/client and tested when parameter is decimal, but once I use generic class, then the server wont react.

SignalRMessage:

public class SignalRMessage<T>
{
    public SignalRMessage(T value, string text)
    {
        Value = value;
        Text = text ?? string.Empty;
    }
    public T Value { get; set; }
    public string Text { get; set; }
}

Hub (OnConnected gets a hit):

 public class JobHeaderHub : Hub
{
    public override Task OnConnectedAsync()
    {
        Debug.WriteLine(Clients.Caller);
        return base.OnConnectedAsync();
    }

    public async Task JobHeaderUpdated(SignalRMessage<decimal> message)
    {
        await Clients.Others.SendAsync("ReceiveJobHeaderUpdated", message);
    }

    public async Task JobHeaderCreated(SignalRMessage<decimal> message)
    {
        await Clients.Others.SendAsync("ReceiveJobHeaderCreated", message);
    }
}

Client:

 public class JobHeaderSingalRClient
{
    private HubConnection connection;

    public JobHeaderSingalRClient()
    {
        //  connection = new HubConnectionBuilder().WithUrl(@"").WithAutomaticReconnect().Build();
        connection = new HubConnectionBuilder().WithUrl(@"http://localhost:5000/jobheader").WithAutomaticReconnect().Build();

        connection.On<SignalRMessage<decimal>>("ReceiveJobHeaderUpdated", message => JobHeaderUpdated?.Invoke(message));
        connection.On<SignalRMessage<decimal>>("ReceiveJobHeaderCreated", message => JobHeaderCreated?.Invoke(message));
    }

    public static async Task<JobHeaderSingalRClient> CreateConnectedClient()
    {
        var client = new JobHeaderSingalRClient();
        await client.ConnectAsync();
        return client;
    }

    public async Task<JobHeaderSingalRClient> ConnectAsync()
    {
        await connection.StartAsync();

        return this;
    }

    public event Action<SignalRMessage<decimal>> JobHeaderUpdated;

    public async Task SendJobHeaderUpdated(decimal id, string message = null)
    {
        await connection.SendAsync("JobHeaderUpdated", new SignalRMessage<decimal>(id, message));
    }

    public event Action<SignalRMessage<decimal>> JobHeaderCreated;

    public async Task SendJobHeaderCreated(decimal id, string message = null)
    {
        await connection.SendAsync("JobHeaderCreated", new SignalRMessage<decimal>(id, message));
    }
}

I have no idea why when parameter is SignalRMessage<decimal> then the methods on server are not getting hit. Anyone knows? Thanks.

Upvotes: 1

Views: 861

Answers (2)

NoConnection
NoConnection

Reputation: 842

This is most probably not related to signalR, but to the underlying JSON serialization. The type has to be specified in order to be able to serialize the objects.

I had similar issues when using objects of type object as parameters.

To troubleshoot turn on verbose error messages in signalR and see if there are any errors logged.

services.AddSignalR(options => 
    {
        options.Hubs.EnableDetailedErrors = true;
    });

Upvotes: 0

Michael Mairegger
Michael Mairegger

Reputation: 7301

I had this sort of issues too when I was using constructors with parameters. All of them disappeared after adding a default parameterless constructor.

Upvotes: 2

Related Questions