SignalR does not provide offline messages on its own.
You will need to store offline messages in a database or somewhere and provide logic to notify users of pending messages.
Naive implementation:
public class ClientHub : Hub
{
public SendMessage(string message, string targetUserName)
{
var userName = Context.User.Identity.Name;
if (HubHelper.IsConnected(targetUserName))
{
Clients.User(targetUserName).sendMessage(message);
}
else
{
DataAccess.InsertPendingMessage(userName, targetUserName, message);
}
}
public SendPendingMessages()
{
var meesages = DataAccess.GetPendingMessages(userName);
Clients.User(userName).processPendingMessages(messages);
}
public override Task OnConnected()
{
var connected = base.OnConnected();
var userName = Context.User.Identity.Name;
if (!string.IsNullOrWhiteSpace(userName))
{
HubHelper.RegisterClient(userName, Context.ConnectionId);
SendPendingMessages();
}
return connected;
}
}
This code assumes that the following is implemented:
- SendMessage client function for displaying a private message
- Client function processPendingMessages to display all pending messages
- A DataAccess object with GetPendingMessages and InsertPendingMessage pending messages.
- HubHelper helper class to support current in-memory client connections.
source
share