私のマシンでは、SignalR クライアント関数が Chrome で呼び出されていないことがわかりました。
私の SignalR テスト アプリは、IE9、Firefox、さらには iPhone の Safari でも問題なく動作します。Fiddler を見ると、これらのブラウザはすべて transport=longPolling をネゴシエートしているようです。しかし、Chrome は transport=serverSentEvents で接続をネゴシエートします。これが、Chrome でクライアント関数が呼び出されない理由だと思います。
詳細: Windows 7 で完全な IIS (IIS Express ではない) を使用しています。SignalR バージョン 1.0.0-rc2 を使用しています。AVG ファイアウォールを無効にしましたが、Windows ファイアウォールが実行されていません。Chrome のバージョンは 24.0.1312.56 で、執筆時点では最新でした。アプリは localhost で呼び出されます。
Chrome では、signalR 接続は正常に行われているようです - $.connection.hub.start().done コールバック関数が呼び出されます。しかしその後、他のブラウザが問題なく動作している間でも、クライアント関数が呼び出されることはありません。
クライアント側のコードでは、ログを有効にしました
$.connection.hub.logging = true;
Chrome の JavaScript コンソールに、接続の成功に対応するログ メッセージが表示されます。参考までに、これらのログ メッセージは次のとおりです。
[20:22:16 GMT+0800 (W. Australia Standard Time)] SignalR: Negotiating with '/SignalRChat-RC/signalr/negotiate'. jquery.signalR-1.0.0-rc2.js:54
[20:22:16 GMT+0800 (W. Australia Standard Time)] SignalR: Attempting to connect to SSE endpoint 'http://localhost/SignalRChat-RC/signalr/connect?transport=serverSentEvents&…7-22c5dbf27e0d&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&tid=3' jquery.signalR-1.0.0-rc2.js:54
[20:22:16 GMT+0800 (W. Australia Standard Time)] SignalR: EventSource connected jquery.signalR-1.0.0-rc2.js:54
[20:22:16 GMT+0800 (W. Australia Standard Time)] SignalR: Now monitoring keep alive with a warning timeout of 40000 and a connection lost timeout of 60000 jquery.signalR-1.0.0-rc2.js:54
ただし、クライアント側のメソッドが呼び出されたときに Chrome の JavaScript コンソールに記録されるメッセージはありません。
興味深いことに、send メソッドは Chrome で正常に動作します。他のクライアントは、Chrome 自体が表示できない場合でも、Chrome から送信されたメッセージを表示します。このアプリケーションは、 http: //www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr の signalR チュートリアルのチャット アプリケーションとほぼ同じです。
start メソッドで明示的に longPolling を指定すると、つまり
$.connection.hub.start({ transport: 'longPolling' })
その後、Chromeは正常に動作します。しかし、私の期待は、ブラウザーが接続をネゴシエートできるようにすることで、問題なく動作することでした。
参考までに、私のクライアント側コードの関連部分は次のようになります。
$(function () {
// Turn on logging to the javascript console
$.connection.hub.logging = true;
// set up an error-handling function
$.connection.hub.error(function (err) {
alert("Error signalR:" + JSON.stringify(err));
});
// Declare a proxy to reference the hub.
var chat = $.connection.chatHub;
// Create a function that the hub can call to broadcast messages.
// This function is never called when running in Chrome with the default signalR connection
chat.client.broadcastMessage = function (name, message) {
// Html encode display name and message.
var encodedName = $('<div />').text(name).html();
var encodedMsg = $('<div />').text(message).html();
// Add the message to the page.
$('#discussion').append('<li><strong>' + encodedName
+ '</strong>: ' + encodedMsg + '</li>');
};
// Get the user name and store it to prepend to messages.
$('#displayname').val(prompt('Enter your name:', ''));
// Set initial focus to message input box.
$('#message').focus();
// Start the connection.
// Use $.connection.hub.start({ transport: 'longPolling' }) for reliability
// Use $.connection.hub.start() to demonstrate that Chrome doesn't receive messages
$.connection.hub.start().done(function () {
// Enable the "Send" button
$('#sendmessage').removeAttr('disabled');
$('#sendmessage').click(function () {
// Call the Send method on the hub.
chat.server.send($('#displayname').val(), $('#message').val());
// Clear text box and reset focus for next comment.
$('#message').val('').focus();
});
});
});
誰かが私が間違っていることを見ることができますか?