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();
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) =>