【发布时间】:2012-04-04 12:27:26
【问题描述】:
我正在尝试使用 SignalR 创建服务器到客户端的广播机制,但它似乎没有做任何事情。
我有一个这样的集线器:
public class DataMessageService : Hub, IClientNotificationService
{
dynamic _clients;
public DataMessageService(IConnectionManager connectionManager)
{
_clients = connectionManager.GetClients<DataMessageService>();
}
public void SendDataChangeNotification(string entityName, string changeType, string id)
{
_clients.dataChangeNotification(new string[] {entityName, changeType, id});
}
}
我的 _Layouts.cshtml 有这个:
var _centralHub;
$(function() {
// startup the signalr hub and get the proxies we need
_centralHub = $.connection.dataMessageService;
$.connection.hub.start();
});
我有一些部分代码,由 jquery 选项卡使用 ajax 加载:
_centralHub.dataChangeNotification = function (data) {
alert(data[0] + "::" + data[1] + "::" + data[2]);
if (data[0] == 'User') {
grid.refresh();
}
};
现在在数据层中,当发生一些粗略的操作时,我调用 DataMessageService.SendDataChangeNotification 但客户端没有任何反应。
我错过了什么吗?
更新:我认为这可能与 vs web 服务器有关,但在使用完整的 IIS 时它也会失败(在 Win 7 上)。
另一个更新: 我将我的服务与我的集线器混淆了。我现在将这些拆分,如下所示,但它仍然不起作用。
public class DataMessageService : IClientNotificationService
{
public void SendDataChangeNotification(string entityName, string changeType, string id)
{
IConnectionManager icm = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = icm.GetClients<DataMessageHub>();
clients.dataChangeNotification(new string[] { entityName, changeType, id });
}
}
public class DataMessageHub : Hub
{
}
:(
更多信息:
这适用于 FireFox,但不适用于 IE 或 Chrome。
我还尝试创建一个简单的示例应用,它在 Chrome 和 IE 上运行良好。
鉴于我们没有可用的网络套接字,长轮询对于我们的用户/基础设施可能不是一个好主意。也许有一天……
【问题讨论】:
-
感谢 Mike 的编辑 :) 我无法很好地格式化代码。
-
我在 SignalR 上遇到过类似的奇怪问题。从 JS 调用一个虚拟的服务器端方法,就在启动之后是我让服务器端调用客户端工作的唯一方法。 '$.connection.hub.start(function() { hubName.dummyMethodOnServer(); });
-
嘿,谢谢。我做了你建议的改变,它起作用了......一次,然后停止了。 :( 不知道为什么,但有希望。
标签: model-view-controller signalr