Функция клиента SignalR не вызывается, когда transport = serverSentEvents

На моих машинах я обнаружил, что функции клиента SignalR не вызываются в Chrome.

Приложение My SignalR test отлично работает с IE9, Firefox и даже Safari на моем iphone. Глядя на Fiddler, эти браузеры, похоже, обсуждают transport = longPolling. Но Chrome согласовывает соединение с transport = serverSentEvents, и я предполагаю, что именно поэтому клиентские функции не вызываются в Chrome.

Подробнее: Я использую полный IIS (не IIS express) в Windows 7. Я использую SignalR версии 1.0.0-rc2. Я отключил брандмауэр AVG, и брандмауэр Windows не работает. Chrome - версия 24.0.1312.56, и была актуальной на момент написания. Приложение вызывается на localhost.

В Chrome соединение signalR, похоже, имеет место ОК - функция $.connection.hub.start(). Вызывается функция обратного вызова. Но после этого клиентская функция никогда не вызывается, даже если другие браузеры работают нормально.

В клиентском коде я включил ведение журнала с помощью

$.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. Другие клиенты отображают сообщение, отправленное из Chrome даже через сам Chrome, не могут его увидеть. Приложение в значительной степени является чат-приложением из учебника signalR в http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr

Если я явно укажу longPolling в методе start, т.е.

$.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();
        });
    });
});

Кто-нибудь может понять, что я делаю неправильно?

+3
24 янв. '13 в 15:10
источник поделиться
3 ответа

Я попробовал образец в 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
+2
31 янв. '13 в 0:42
источник

Может быть, это связано с буферизацией ответов.

https://github.com/SignalR/SignalR/issues/1944

0
23 нояб. '13 в 11:59
источник

Попробуйте установить EnableJSONP = False на серверный концентратор. Это фиксировало аналогичную проблему, которую я имел.

0
11 июл. '16 в 21:22
источник

Посмотрите другие вопросы по меткам или Задайте вопрос