私は次のJSコードを持っています
var chat = $.connection.MyHub;
chat.client.initChart = function (data) {
... do stuff ...
}
そしてこのハブコード
public class MyHub : Hub
{
public override Task OnConnected()
{
using (var conn = new SqlConnection(ConnectionString))
{
conn.Open();
//Using Dapper
var data = conn.Query("SELECT data FROM Sql").ToList();
return Clients.Caller.initChart(data);
}
}
}
これは私のマシン(Win7Pro、IIS 7)で完全に機能しますが、サーバー(Win2008R2、iis7)に展開すると、initChart
関数が呼び出されません。サーバーにVSをインストールしました。プロセスをデバッグすると、OnConnected
イベントが呼び出されて正常に完了しますが、クライアントでは何も起こりません。私が見ることができるJSエラーやサーバー側エラーは発生していません。
さらに混乱させるために、NServiceBusハンドラーによって呼び出される別の関数がクライアントで宣言されています。この関数は毎回呼び出され、そこにブラウザーブレークポイントを設定すると、呼び出されていることがわかります。
私のマシンでsignalRログを確認すると、SSEが使用されますが、サーバーでは長いポーリングにフォールバックします。
更新:サーバーがAkamaiのDSDの背後にあることに気づきました。これを実行しないと、機能しますが、なぜ違いが生じるのかわかりません。
2回目の更新:
connect?transport=serverSentEvents&connectionId=9fce5552-4c2e-4739-93ea-501dda0a0654&connectionData=%5B%7B%22name%22%3A%22navigationtiminghub%22%7D%5D&tid=9 HTTP/1.1
通話のさまざまな応答ヘッダーは次のとおりです
まず、オリジンに直接電話したときのリクエスト:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Transfer-Encoding: chunked
Content-Type: text/event-stream
Expires: -1
Server: Microsoft-IIS/7.5
Date: Mon, 07 Jan 2013 01:08:26 GMT
これがアカマイの回答です。wiresharkによると、サーバーからAkamaiへの応答は上記の応答と同じであることに注意してください。
HTTP/1.1 200 OK
Content-Type: text/event-stream
Server: Microsoft-IIS/7.5
Expires: Mon, 07 Jan 2013 01:07:23 GMT
Cache-Control: max-age=0, no-cache, no-store
Pragma: no-cache
Date: Mon, 07 Jan 2013 01:07:23 GMT
Content-Length: 486
Connection: keep-alive
また、最初の接続では(必要に応じて)接続が開いたままになり、2番目の接続は閉じます。
更新3:これは純粋にアカマイの問題です。Edgecastに切り替えただけで、SSE接続に正しく応答します。