2013-05-06 29 views
8

C#5の非同期/待機機能を使用してSignalRアプリケーションを作成しようとしていますが、コードを実行するたびにSystem.InvalidOperationExceptionがスローされます。問題を再現するための最も簡単なコードは次のとおりです。SignalR - ハブで非同期タスクを実行する方法?

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

例外の詳細:

非同期操作は、この時点で開始することはできません。非同期操作は、非同期ハンドラまたはモジュール内、またはページライフサイクルの特定のイベント中にのみ開始できます。ページの実行中にこの例外が発生した場合は、Pageが<%@ 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); 
    }); 
}); 

どうしたのですか?回避策はありますか?可能であれば、C#の非同期/待機パターンに固執することが本当に熱心です。

+0

メソッド名の前にキーワードasyncを追加して、GetGoogleメソッドの非同期化を試みましたか? –

+0

はい、私はそれを試して、それは動作しませんでした。ついにスティーブンの答えが私の問題を解決しました。 –

答えて

10

WebClientHttpClientに置き換えてみます。 DownloadStringTaskAsyncは、既存のEAPメソッドよりもasyncの「ボルトオン」サポートの一種であり、SignalRが反対しているのはEAPメソッドです。 HttpClientTAPを直接使用します。

+0

ありがとうございました!私は2泊かけてその作業をしようと努力しましたが、それは良い古いWebClientが犯人であることを私に打ち消すことはありません。 –

関連する問題