我有以下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连接。
答案 0 :(得分:2)
您可以在上面的标题中看到这一点,因为您有一个Content-Length
标题,而且您的答案中也缺少Transfer-Encoding
标题。
您无法自行启用缓冲,但您可以让他们的专业服务团队为您执行此操作。
这似乎修复了Chrome的Server Sent事件,但不是IE9的Forever Frame。
使用Forever Frame,这似乎是一个压缩问题。如果您从请求中查找Transfer-Encoding: chunked
标头,则会恢复Accept-Encoding
标头。 IE运行良好。集线器网址需要排除边缘的gzip功能。