SignalR - Как выполнить задачу async в концентраторе?

Я пытаюсь создать приложение SignalR с использованием функций async/await С# 5, но всякий раз, когда выполняется код, он генерирует исключение System.InvalidOperationException. Вот простейший код для воспроизведения проблемы.

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

Сведения об исключении:

Асинхронная операция не может быть запущена в это время. Асинхронные операции могут запускаться только в асинхронном обработчике или модуле или во время определенных событий в жизненном цикле страницы. Если это исключение произошло во время выполнения страницы, убедитесь, что страница отмечена <% @Page Async =\ "true \" % > .

Трассировка стека:

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)

На стороне клиента Javascript выглядит следующим образом.

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

Что я сделал неправильно? Есть ли обходные пути? Я действительно стараюсь придерживаться шаблонов async/await на С#, если возможно вообще.

Ответ 1

Я бы постарался заменить WebClient на HttpClient. DownloadStringTaskAsync - это своего рода поддержка "болтов" для async над существующими методами EAP, и это методы EAP, против которых ссылается SignalR. HttpClient напрямую использует TAP.