Map and invoke SignalR methods in a strongly typed way on the client and server.
public interface IChatHub
{
    string GetConnectionId();
    void SendMessage(string message, IProgress<int> onProgress);
    void Login(string name);
}
public interface IChatHubClient
{
    void NewMessage(string message);
    void Greet(string name);
}
public class ChatHub : Hub<IChatHubClient>, IChatHub
{
    public string GetConnectionId()
    {
        return Context.ConnectionId;
    }
    public void SendMessage(string message, IProgress<int> onProgress)
    {
        for (var i = 1; i <= 10; i++)
        {
            Thread.Sleep(200);
            onProgress.Report(i * 10);
        }
        Clients.All.NewMessage(message);
    }
    public void Login(string name)
    {
        Clients.Caller.Greet(name);
    }
}
public class ChatHubClient : IChatHubClient
{
    public void Greet(string name)
    {
        Console.WriteLine("Hello, {0}!", name);
    }
    public void NewMessage(string message)
    {
        Console.WriteLine("MESSAGE RECEIVED: {0}", message);
    }
}    
public class Program
{
    public static void Main()
    {
        var hubConnection = new HubConnection("http://localhost:55555/");
        var hub = hubConnection.CreateHubProxy<IChatHub>("ChatHub");
        var client = new ChatHubClient();
        hubConnection.Start().Wait();
        // Replaces multiple calls to hub.On("NewMessage", ...);
        hub.MapClientMethods<IChatHubClient>(client);
        // Replaces hub.Invoke<string>("GetConnectionId");
        var connectionId = hub.Invoke(h => h.GetConnectionId()).Result;
        Console.WriteLine("Connected with ID: {0}", connectionId);
        Console.Write("What's your name? ");
        var name = Console.ReadLine();
        // Replaces hub.Invoke("Login", name);
        hub.Invoke(h => h.Login(name));
        while (true)
        {
            var message = Console.ReadLine();
            // Replaces hub.Invoke("SendMessage", (int x) => OnProgress(x), message);
            hub.Invoke((h, p) => h.SendMessage(message, p), (int x) => OnProgress(x));
        }
    }
    private static void OnProgress(int progress)
    {
        Console.WriteLine("{0}%", progress);
    }
}