Search code examples
winformssignalrasp.net-core-6.0asp.net-core-signalr

SignalR callback seems not firing in ASP.NET Core 6 Web API with .NET 6 Winforms client


I have a SignalR hub where messages are reaching from client but callback not seems to work.

Server code:

public class ChatHub : Hub<IChatClient>
{
    private readonly ILogger<ChatHub> _logger;

    public ChatHub(ILogger<ChatHub> logger)
    {
        _logger = logger;
    }

    public async Task SendMessage(ChatMessage message)
    {
        try
        {
            if (message != null && message.From > 0 && message.To > 0)
            {
               ....
            }

            await Clients.All.ReceiveMessage(message);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, $"Error in SendMessage  {ex.Message}");
        }
    }
}

Client code for configuring the SignalR:

 private void connectChat()
    {
        _signalRConnection = new HubConnectionBuilder()
           .WithUrl(Properties.Settings.Default.APIPath + "/hubs/chat").WithAutomaticReconnect()
           .Build();

         try
        {

            //Connect to the server
            _signalRConnection.StartAsync().ContinueWith(task =>
            {
                if (task.IsFaulted)
                {
                    this.Invoke(new Action(() => txtMessages.AppendText("There was an error opening the connection: " + task.Exception.GetBaseException().Message)));
                }
                else
                {
                    this.Invoke(new Action(() => txtMessages.AppendText("Connected")));
                }
            });

            _signalRConnection.On<string, ChatMessage>("ReceiveMessage", (name, message) =>
            {
                if (txtMessages.InvokeRequired)
                {
                    txtMessages.Invoke(new Action(() => txtMessages.AppendText($"{name} : {message?.MessageText}" + Environment.NewLine)));
                }
                else
                {
                    txtMessages.AppendText($"{name} : {message?.MessageText}" + Environment.NewLine);
                }
            });
        }
        catch (Exception)
        {
            throw;
        }
    }   

Client code for sending message

ChatMessage message = new ChatMessage();

message.MessageText = txtChatMessage.Text;
message.From = UserId.Value;
message.To = toStation;
message.MessageTime = DateTime.Now;

_signalRConnection.SendAsync("SendMessage", message).Wait();

Solution

  • I think it is because your client method ReceiveMessage has one parameter:

    await Clients.All.ReceiveMessage(message);
    

    While binding event handler you are binding two parameters:

    _signalRConnection.On<string, ChatMessage>("ReceiveMessage", (name, message) =>
    

    Correct this to bind right number of parameters.

    _signalRConnection.On<ChatMessage>("ReceiveMessage", (message) =>