SignalR - ¿Cómo realizar una tarea asíncrona en el hub?

Estoy tratando de crear una aplicación SignalR utilizando las funciones async / await de C # 5, pero cada vez que se ejecuta el código, se lanzará una excepción System.InvalidOperationException. Aquí está el código más simple para reproducir el problema.

public class SampleHub : Hub
{
    public Task<string> GetGoogle()
    {
        var http = new WebClient();
        return http.DownloadStringTaskAsync("http://www.google.com");
    }
}

Detalles de la excepción:

No se puede iniciar una operación asíncrona en este momento. Las operaciones asíncronas solo pueden iniciarse dentro de un controlador o módulo asíncrono o durante ciertos eventos en el ciclo de vida de la página. Si se produjo esta excepción al ejecutar una página, asegúrese de que la página esté marcada como <% @ Page Async = \ "true \"%>.

Rastreo de pila:

at System.Web.AspNetSynchronizationContext.OperationStarted()
at System.Net.WebClient.DownloadStringAsync(Uri address, Object userToken)
at System.Net.WebClient.DownloadStringTaskAsync(Uri address)
at System.Net.WebClient.DownloadStringTaskAsync(String address)

En el lado del cliente, el Javascript se ve así.

$.connection.hub.start().done(function () {
    $('#google').click(function () {
        var google = sample.server.getGoogle();
        console.log(google);
    });
});

¿Qué hice mal? ¿Hay alguna solución? Estoy realmente interesado en seguir los patrones async / await en C # si es posible.

Respuestas a la pregunta(1)

Su respuesta a la pregunta