SignalR – 如何在集线器中执行异步任务?

我正在尝试使用C#5异步/等待function创建SignalR应用程序,但每当代码运行时,它将抛出System.InvalidOperationException。 这是重现问题的最简单的代码。

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

例外细节:

此时无法启动异步操作。 异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动。 如果在执行页面时发生此exception,请确保将页面标记为。

堆栈跟踪:

 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); }); }); 

我做错了什么? 有没有解决方法? 我真的很想坚持使用C#中的异步/等待模式,如果可能的话。

我会尝试用HttpClient替换WebClientDownloadStringTaskAsync是对现有EAP方法的async的一种“螺栓固定”支持,它是SignalR反对的EAP方法。 HttpClient直接使用TAP 。