Orleans is a framework that provides a straight-forward approach to building distributed high-scale computing applications, without the need to learn and apply complex concurrency or other scaling patterns.
ASP.NET Core SignalR is a new library for ASP.NET Core developers that makes it incredibly simple to add real-time web functionality to your applications. What is "real-time web" functionality? It's the ability to have your server-side code push content to the connected clients as it happens, in real-time.
Sketch7.SignalR.Orleans is a package that allow us to enhance the real-time capabilities of SignalR by leveraging Orleans distributed cloud platform capabilities.
Installation is performed via NuGet
Version | .NET | Status |
---|---|---|
1.x | netcore2 | |
2.x | netcore3 | |
3.x | net5 | |
4.x | net6 | |
5.x | net7 |
From Package Manager:
PS> Install-Package Sketch7.SignalR.Orleans PS> Install-Package Sketch7.SignalR.Orleans.AspNet
.Net CLI:
# dotnet add package Sketch7.SignalR.Orleans # dotnet add package Sketch7.SignalR.Orleans.AspNet
Paket:
# paket add Sketch7.SignalR.Orleans # paket add Sketch7.SignalR.Orleans.AspNet
We need to configure the Orleans Silo with the below:
- Use
.UseSignalR()
onISiloHostBuilder
.
Example
new HostBuilder()
.UseOrleans((context, siloBuilder) =>
{
siloBuilder
.AddMemoryGrainStorage("PubSubStore") // You can use any other storage provider as long as you have one registered as "PubSubStore".
.UseSignalR();
});
Optional configuration to override the default implementation for both providers which by default are set as Memory
.
Example
.UseSignalR(signalrBuilder => signalrBuilder.Configure((sb, opts) =>
{
siloBuilder.AddMemoryGrainStorage(opts.StorageProvider);
}));
Now your SignalR application needs to connect to the Orleans Cluster by using an Orleans Client:
- Use
.UseSignalR()
onIClientBuilder
.
Example
var hostBuilder = new HostBuilder()
.UseOrleans((ctx, builder) =>
{
builder.UseSignalR()
});
hostBuilder.RunConsoleAsync();
Somewhere in your Startup.cs
:
- Add the following in
ConfigureServices
. - Use
.AddSignalR()
onIServiceCollection
(this is part ofMicrosoft.AspNetCore.SignalR
nuget package). - Use
AddOrleans()
on.AddSignalR()
.
Example
public void ConfigureServices(IServiceCollection services)
{
...
services
.AddSignalR()
.AddOrleans();
...
}
Great! Now you have SignalR configured and Orleans SignalR backplane built in Orleans!
HubContext
gives you the ability to communicate with the client from orleans grains (outside the hub).
Sample usage: Receiving server push notifications from message brokers, web hooks, etc. Ideally first update your grain state and then push signalr message to the client.
public class UserNotificationGrain : Grain<UserNotificationState>, IUserNotificationGrain
{
private HubContext<IUserNotificationHub> _hubContext;
public override async Task OnActivateAsync()
{
_hubContext = GrainFactory.GetHub<IUserNotificationHub>();
// some code...
await _hubContext.User(this.GetPrimaryKeyString()).Send("Broadcast", State.UserNotification);
}
}
PRs and feedback are very welcome!