Duc Dang
Posted on August 17, 2024
In today’s fast-paced digital world, delivering the latest information without refreshing the user interface is crucial. SignalR is a powerful library in .NET that allows you to push content from your server-side code to any connected clients in real-time. This post will guide you through the basics of using SignalR to build real-time applications.
Why SignalR?
SignalR simplifies the process of adding real-time functionality to your applications. It abstracts away the complexities of managing connections and message transport, allowing you to focus on building features.
Getting Started with SignalR
- Install the Package: Begin by installing the Microsoft.AspNetCore.SignalR.Client NuGet package.
dotnet add package Microsoft.AspNetCore.SignalR.Client
- Create a Hub: The Hub is the central component responsible for managing clients and sending messages. Create a
NotificationsHub
by inheriting from the baseHub
class.
using Microsoft.AspNetCore.SignalR;
public class NotificationsHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
- Register Services: Register the SignalR services by calling the
AddSignalR
method and map your hub using theMapHub<T>
method.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<NotificationsHub>("/notificationsHub");
});
}
Testing SignalR
To test your SignalR implementation, you can use Postman’s WebSocket Request to connect to the NotificationsHub
. This allows you to send and receive messages in real-time, ensuring your setup works correctly.
- Connect to the NotificationsHub
- Set the communication protocol to JSON
- Send messages to call the
NotificationsHub
methods
All messages need to end with a null termination character, which is just the ASCII character 0x1E
.
Let's start off by sending this message to set the communication protocol to JSON:
{
"protocol": "json",
"version": 1
}?
You'll receive this response from the hub.
We need a slightly different message format to call a message on the Hub
. The key is specifying the arguments
and target, which is the actual hub method we want to call.
Let's say we want to call the SendNotification
method on the NotificationsHub
:
{
"arguments": ["This is the notification message."],
"target": "SendNotification",
"type": 1
}
This will be the response we get back from the NotificationsHub
:
Strongly Typed Hubs
SignalR supports strongly typed hubs, which help enforce method parameters and reduce errors. Define a client interface and update your hub class to inherit from Hub<T>
.
public interface INotificationsClient
{
Task ReceiveMessage(string user, string message);
}
public class NotificationsHub : Hub<INotificationsClient>
{
public async Task SendMessage(string user, string message)
{
await Clients.All.ReceiveMessage(user, message);
}
}
Sending Notifications
Use the IHubContext<THub, TClient>
interface to send notifications to specific users. SignalR tracks users internally, allowing you to target messages based on user identifiers.
public class NotificationService
{
private readonly IHubContext<NotificationsHub, INotificationsClient> _hubContext;
public NotificationService(IHubContext<NotificationsHub, INotificationsClient> hubContext)
{
_hubContext = hubContext;
}
public async Task SendNotification(string userId, string message)
{
await _hubContext.Clients.User(userId).ReceiveMessage("System", message);
}
}
Conclusion
Adding real-time functionality to your application with SignalR can significantly enhance user experience. Start building real-time apps in .NET today and see the difference it makes!
Posted on August 17, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.