Product Engineer, CTO & a Beer Enthusiast
Experiments, thoughts and scripts documented for posterity.
Jun, 2012
SignalR is a cool asynchronous signaling library for ASP.NET to build real-time applications or for any push based notifications. SignalR is similar to Socket.IO or NowJS. Before the workd of web-sockets, there was Comet which was basically a long-held HTTP requests.
using SignalR;
using System.Threading.Tasks;
namespace Services
{
public class MyConnection : PersistentConnection
{
protected override Task OnReceivedAsync(string clientId, string data)
{
// Broadcast data to all clients
return Connection.Broadcast(data);
}
}
}
public void AddToGroup(string clientId, string groupName);
protected virtual void OnConnected(HttpContextBase context, string clientId);
protected virtual Task OnConnectedAsync(HttpContextBase context, string clientId);
protected virtual void OnDisconnect(string clientId);
protected virtual Task OnDisconnectAsync(string clientId);
protected virtual void OnError(Exception e);
protected virtual Task OnErrorAsync(Exception e);
protected virtual void OnReceived(string clientId, string data);
protected virtual Task OnReceivedAsync(string clientId, string data);
public void RemoveFromGroup(string clientId, string groupName);
public void Send(object value);
public void Send(string clientId, object value);
public void SendToGroup(string groupName, object value);
protected void Application_Start()
{
Bootstrapper.Run();
RouteTable.Routes.MapConnection("Notification", "Notification/{*operation}");
RegisterRoutes(RouteTable.Routes);
AreaRegistration.RegisterAllAreas();
}
$(function () {
var connection = $.connection('notification');
<br />
connection.received(function (data) {
$('#messages').append('
<li>' + data + '</li>');
});
<br />
connection.start(); //start the connection
<br />
$("#broadcast").click(function () {
connection.send($('#msg').val());
});
});
<br />
using SignalR.Client;
public sealed class PushClass
{
private static volatile PushClass instance;
private static object syncRoot = new Object();
private Connection broadcastConnection;
private PushClass()
{
broadcastConnection = new Connection("http://localhost/Notification");
broadcastConnection.Start().Wait();
}
public static PushClass Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new PushClass();
}
}
return instance;
}
}
public void Broadcast(string msg)
{
broadcastConnection.Send(msg);
}
}
var pushInstance= PushClass.Instance;
pushInstance.Broadcast('blah');
public class PushClass
{
public static void Broadcast(string data)
{
try
{
var client = new SignalR.Client.Connection("http://localhost/Notification");
var tx = client.Start().ContinueWith(t =>
{
if(t.IsFaulted) Console.WriteLine(t.Exception.GetBaseException()); client.Send(data).ContinueWith(t2 =>{ if(t2.IsFaulted) Console.WriteLine(t2.Exception.GetBaseException());
});
});
tx.ContinueWith(y =>{
if (y.IsFaulted || y.Exception != null)
Console.WriteLine(y.Exception.Message);
});
tx.Wait();
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
The calling class can do the following:
Task asyncSignalr = Task.Factory.StartNew(() => PushClass.Broadcast("blah");
asyncSignalr.ContinueWith(t =>
{
if (t.IsFaulted)
Console.WriteLine(t.Exception.Flatten().ToString());
});