Google chrome transport=serverSentEvents时未调用信号器客户端函数

Google chrome transport=serverSentEvents时未调用信号器客户端函数,google-chrome,signalr,Google Chrome,Signalr,在我的机器上,我发现在Chrome中没有调用Signal客户端函数 我的SignalR测试应用程序可以与IE9、Firefox甚至iphone上的Safari配合使用。看看Fiddler,这些浏览器似乎都在协商transport=longPolling。但是Chrome通过transport=serverSentEvents协商连接,我假设这就是为什么Chrome中不调用客户端函数的原因 更多详细信息: 我正在Windows 7上使用完整IIS(不是IIS express)。我使用的是信号器版本

在我的机器上,我发现在Chrome中没有调用Signal客户端函数

我的SignalR测试应用程序可以与IE9、Firefox甚至iphone上的Safari配合使用。看看Fiddler,这些浏览器似乎都在协商transport=longPolling。但是Chrome通过transport=serverSentEvents协商连接,我假设这就是为什么Chrome中不调用客户端函数的原因

更多详细信息: 我正在Windows 7上使用完整IIS(不是IIS express)。我使用的是信号器版本1.0.0-rc2。我已禁用AVG防火墙,Windows防火墙未运行。Chrome版本为24.0.1312.56,在撰写本文时是最新的。在本地主机上调用该应用程序

在Chrome上,信号器连接似乎正常-调用$.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本身看不到。 该应用程序基本上是位于的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>:&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();
        });
    });
});
$(函数(){
//打开javascript控制台的日志记录
$.connection.hub.logging=true;
//设置错误处理函数
$.connection.hub.error(函数(err){
警报(“错误信号器:+JSON.stringify(err));
});
//声明代理以引用中心。
var chat=$.connection.chatHub;
//创建一个中心可以调用以广播消息的函数。
//使用默认信号器连接在Chrome中运行时,不会调用此函数
chat.client.broadcastMessage=函数(名称、消息){
//Html编码显示名称和消息。
var encodedName=$('').text(name).html();
var encodedMsg=$('').text(message.html();
//将消息添加到页面。
$(“#讨论”)。追加(“
  • ”+encodedName +“:”+encodedMsg+”
  • ); }; //获取用户名并将其存储到消息前。 $('#displayname').val(提示('输入您的姓名:',''); //将初始焦点设置为消息输入框。 $(“#消息”).focus(); //启动连接。 //使用$.connection.hub.start({transport:'longPolling'})提高可靠性 //使用$.connection.hub.start()演示Chrome不接收消息 $.connection.hub.start().done(函数(){ //启用“发送”按钮 $('#sendmessage').removeAttr('disabled'); $('#sendmessage')。单击(函数(){ //在集线器上调用Send方法。 chat.server.send($('#displayname').val(),$('#message').val()); //清除文本框并重置下一条注释的焦点。 $('#message').val('.focus(); }); }); });

    有人知道我做错了什么吗?

    我在Win7 Google Chrome 24中尝试了这个示例,效果很好

    您可以在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
    

    这可能与缓冲响应有关


    尝试在服务器集线器上设置
    EnableJSONP=False
    。这解决了我遇到的一个类似问题。

    Wow…今天突然,我在使用Signalr 2.4.1的Chrome上遇到了这个问题!客户端消息在Firefox上运行良好。但不是在铬上。