2013-01-24 57 views
3

在我的機器上,我發現在Chrome中不調用SignalR客戶機功能。當transport = serverSentEvents時,不會調用SignalR客戶機功能

我的SignalR測試應用程序可以正常使用IE9,Firefox甚至是Safari上的iPhone。看着Fiddler,這些瀏覽器似乎都在協商transport = longPolling。但是,Chrome與transport = serverSentEvents協商了一個連接,我假設這就是爲什麼客戶端功能不在Chrome中調用的原因。

更多詳細信息: 我在Windows 7上使用完整的IIS(不是IIS Express)。我使用SignalR版本1.0.0-rc2。我禁用了AVG防火牆,Windows防火牆未運行。 Chrome的版本爲24.0.1312.56,並且在撰寫本文時爲最新版本。該應用程序在本地主機上調用。

在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控制檯時調用的客戶端的方法時的消息。

有趣的是,在Chrome上,send方法正常。其他客戶端顯示Chrome發送的消息,即使通過Chrome瀏覽器本身也無法看到。 該應用程序是非常從signalR教程在http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr

聊天應用程序如果我明確的啓動方法指定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>:&nbsp;&nbsp;' + 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(); 
     }); 
    }); 
}); 

任何人都可以看到我在做什麼錯?

回答

2

我試過Win7的Google Chrome 24中的示例,它工作正常。

可以解決安裝Fiddler並在JavaScript

POST /signalr/send?transport=serverSentEvents&connectionId=6ff0bffa-c31e-4d85-9aff-24f4528555ee HTTP/1.1 
Host: localhost:43637 
Connection: keep-alive 
Content-Length: 113 
Accept: application/json, text/javascript, */*; q=0.01 
Origin: 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17 
Content-Type: application/x-www-form-urlencoded 
Referer: /index.html 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

data=%7B%22H%22%3A%22chathub%22%2C%22M%22%3A%22Send%22%2C%22A%22%3A%5B%22gus%22%2C%22hello%22%5D%2C%22I%22%3A0%7D 
0

嘗試在服務器集線器設置EnableJSONP = False。這固定了我遇到的類似問題。