🧩 SignalP — Lightweight WebSocket Middleware for .NET SignalP is a minimal, developer-friendly alternative to SignalR — built on pure WebSockets for real-time communication in .NET applications.
Sometimes, you don’t need a full framework — just a socket that works.
🚀 Features 🔹 Simple WebSocket-based middleware 🔹 Automatic connection & disconnection handling 🔹 Built-in broadcast, private, and group messaging 🔹 Native WebSocket client support (no SDK required) 🔹 ASP.NET Core integration with Dependency Injection 🔹 Perfect for IoT dashboards, chat, admin tools, and internal systems
🛠️ Installation Add the package (when published):
dotnet add package SignalP
Or include the source in your project.
⚙️ Setup
Program.cs
using SignalP;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddSignalP(); // Register SignalP middleware
var app = builder.Build();
app.UseHttpsRedirection();
app.UseWebSockets(); //Must enable WebSockets
app.UseSignalP(opts =>
{
opts.Path = "/signalp"; // WebSocket endpoint
});
app.MapControllers();
app.Run();
💬 Client Example (Browser)
const ws = new WebSocket("wss://yourapp.azurewebsites.net/signal?user=JHPoint");
ws.onopen = () => console.log("✅ Connected");
ws.onmessage = (msg) => console.log("📩 Message:", msg.data);
ws.onclose = () => console.log("❌ Disconnected");
function broadcast(payload) {
ws.send(JSON.stringify({ type: "broadcast", payload }));
}
broadcast("Hello from browser!");
🧠 Message Structure
SignalP uses a simple JSON message format:
{
"type": "broadcast",
"payload": "Hello, world!",
"target": "optionalConnectionId"
}
Supported types
- broadcast — sends to all clients
- private — sends to a specific connection
- group — sends to clients in a named group
🆚 SignalP vs SignalR vs Raw WebSocket
| Feature | Raw WebSocket | SignalP | SignalR |
|---|---|---|---|
| Transport | WebSocket only | WebSocket only | WebSocket, SSE, Long Polling |
| Client | Native WS | Native WS | Requires SDK |
| Connection Handling | Manual | Auto IDs & events | Managed framework |
| Message Routing | Manual | Broadcast, Private, Group | Hubs & Groups built-in |
| Scale-Out | Manual (Redis) | Manual (Redis optional) | Built-in (Azure SignalR Service) |
| Complexity | High | Low | Moderate |
| Ideal For | Custom protocols | Dashboards, Chat, IoT, Admin | Enterprise, Chat, Collaboration |
🧩 Using SignalP in Controllers You can inject and use SignalPService in your controllers:
[ApiController]
[Route("api/[controller]")]
public class NotifyController : ControllerBase
{
private readonly SignalPService _signalP;
public NotifyController(SignalPService signalP)
{
_signalP = signalP;
}
[HttpPost("send")]
public async Task<IActionResult> SendMessage([FromBody] string message)
{
await _signalP.SendToAllAsync(new { type = "broadcast", payload = message });
await _signalP.SendToConnectionAsync("abc123", new { payload = "Hello JH!" });
await _signalP.SendToGroupAsync("admins", new { payload = "New dashboard alerts!" });
await _signalP.AddToGroupAsync("abc123", "admins");
await _signalP.RemoveFromGroupAsync("abc123", "admins");
if (_signalP.TryGetConnectionInfo("abc123", out var info))
{
Console.WriteLine($"User {info.User} connected at {info.User}");
}
return Ok();
}
}
⚡ Running in Azure
- Go to App Service → Configuration → General Settings
- Set WebSockets = On
- Deploy and connect to
wss://yourapp.azurewebsites.net/signal
No Azure SignalR Service required.
🧰 Future Plans 🔸 JWT-based authentication 🔸 Redis Pub/Sub scale-out 🔸 Automatic reconnection support 🔸 Group persistence
🧑💻 Author Joever Monceda Founder & CEO, Repoint Solutions Inc.
Copyright (c) 2025 Joever Monceda
Linkedin: Joever Monceda
Medium: Joever Monceda
Twitter @_EthanHunt07
Facebook: Ethan Hunt