SignalP 1.0.0
dotnet add package SignalP --version 1.0.0
NuGet\Install-Package SignalP -Version 1.0.0
<PackageReference Include="SignalP" Version="1.0.0" />
<PackageVersion Include="SignalP" Version="1.0.0" />
<PackageReference Include="SignalP" />
paket add SignalP --version 1.0.0
#r "nuget: SignalP, 1.0.0"
#:package SignalP@1.0.0
#addin nuget:?package=SignalP&version=1.0.0
#tool nuget:?package=SignalP&version=1.0.0
π§© 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.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.
License
Copyright (c) 2025 Joever Monceda
Linkedin: Joever Monceda
Medium: Joever Monceda
Twitter @_EthanHunt07
Facebook: Ethan Hunt
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- Microsoft.AspNetCore.Hosting (>= 2.3.0)
- Microsoft.AspNetCore.Http (>= 2.3.0)
- Microsoft.AspNetCore.Http.Abstractions (>= 2.3.0)
- Microsoft.AspNetCore.TestHost (>= 8.0.20)
- Microsoft.AspNetCore.WebSockets (>= 2.3.0)
- Microsoft.Extensions.Logging.Abstractions (>= 9.0.9)
- Microsoft.NET.Test.Sdk (>= 17.9.0)
- xunit (>= 2.4.2)
- xunit.assert (>= 2.9.3)
- xunit.runner.visualstudio (>= 2.4.5)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0 | 196 | 10/14/2025 |
- Initial release of SignalP 🚀
- WebSocket-based lightweight real-time communication middleware
- Supports groups, broadcast, and targeted messaging
- DI-ready for ASP.NET Core controllers
- Added SendToAllAsync, SendToConnectionAsync, and group management methods