在通过CDN时不会调用signalR客户端功能

时间:2013-01-06 21:32:53

标签: signalr

我有以下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后面,如果我没有通过它,它可以工作,但我不明白它为什么会有所作为。

第二次更新:

以下是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

这是Akamai的回应。请注意,根据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

同样在第一个中,连接保持打开(应该如此),在第二个中它关闭。

更新3:这纯粹是一个Akamai问题,我们刚刚切换到Edgecast& amp;他们正确回应了SSE连接。

1 个答案:

答案 0 :(得分:2)

您可以在上面的标题中看到这一点,因为您有一个Content-Length标题,而且您的答案中也缺少Transfer-Encoding标题。

您无法自行启用缓冲,但您可以让他们的专业服务团队为您执行此操作。

这似乎修复了Chrome的Server Sent事件,但不是IE9的Forever Frame。

使用Forever Frame,这似乎是一个压缩问题。如果您从请求中查找Transfer-Encoding: chunked标头,则会恢复Accept-Encoding标头。 IE运行良好。集线器网址需要排除边缘的gzip功能。