我有以下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 连接。