0

我有以下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,他们正确响应了 SSE 连接。

4

1 回答 1

2

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

您不能自己启用缓冲,但您可以让他们的专业服务团队为您做这件事。

这似乎修复了 Chrome 的服务器发送事件,但没有修复 IE9 的 Forever Frame。

对于 Forever Frame,这似乎是一个压缩问题。如果您从请求中删除标Transfer-Encoding: chunked头,则会恢复标头。Accept-Encoding然后 IE 工作得很好。集线器 URL 需要排除边缘的 gzip 功能。

于 2013-01-10T09:47:59.983 回答