【问题标题】:signalR client function not being called when going through a CDN通过 CDN 时未调用 signalR 客户端函数
【发布时间】:2025-12-01 04:55:02
【问题描述】:

我有以下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 处理程序调用的函数,这个函数每次都会被调用,我在其中放置了一个浏览器断点,我可以看到它被调用了。

在我使用 SSE 的机器上检查 signalR 日志,但在服务器上它回退到长轮询。

更新:刚刚意识到服务器位于 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 调用的不同响应标头

首先,我直接调用origin时的请求:

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 连接。

【问题讨论】:

  • 尝试开启登录。 $.connection.hub.logging=true
  • 好的,谢谢,在服务器上 SSE 失败,回退到 longPolling
  • 是否有任何服务器端错误?
  • 不,但我只是绕过 Akaimi,服务器在后面,它可以工作。会有不同的反应吗?
  • 它可能正在缓冲/压缩/缓存响应。这样的事情可能会破坏流连接,但你可以让长轮询工作。

标签: signalr


【解决方案1】:

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

您自己无法启用缓冲,但可以让他们的专业服务团队为您完成。

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

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

【讨论】: