Signalr 不调用客户端函数
Signalr not calling client function
我知道有人问过这个问题several times,但其他人发布的解决方案不是我的解决方案。所以,我希望有另一个解决这个问题的答案。
在服务器上对此进行调试时,它会找到合适的客户端并调用 "addAlert" 方法。此 Javascript 初始化正常并且 "Alert Ready" 消息写入控制台。
服务器和客户端代码上都没有错误消息:
$(function () {
// enable logging for debugging
$.connection.hub.logging = true;
// Declare a proxy to reference the hub.
var hub = $.connection.alertHub;
hub.client.addAlert = function (id, title, url, dateTime) {
console.log(title);
};
$.connection.hub.start().done(function () {
console.log("Alert Ready");
});
});
[09:12:51 GMT-0600 (Central America Standard Time)] SignalR: Client
subscribed to hub 'alerthub'. jquery.signalR-2.0.0.min.js:8 [09:12:51
GMT-0600 (Central America Standard Time)] SignalR: Negotiating with
'/signalr/negotiate?connectionData=%5B%7B%22name%22%3A%22alerthub%22%7D%5D&clientProtocol=1.3'.
jquery.signalR-2.0.0.min.js:8 [09:12:51 GMT-0600 (Central America
Standard Time)] SignalR: Connecting to websocket endpoint
'ws://mysite.local/signalr/connect?transport=webSockets&connectionToken=c…OZxqiRQKOc%3D&connectionData=%5B%7B%22name%22%3A%22alerthub%22%7D%5D&tid=4'.
jquery.signalR-2.0.0.min.js:8 [09:12:51 GMT-0600 (Central America
Standard Time)] SignalR: Websocket opened.
jquery.signalR-2.0.0.min.js:8 [09:12:51 GMT-0600 (Central America
Standard Time)] SignalR: Now monitoring keep alive with a warning
timeout of 13333.333333333332 and a connection lost timeout of 20000.
上面的日志就是所有发生的事情,即使在从服务器调用客户端函数之后也是如此:
string dateTime;
foreach(var connection in ConnectionMapping<Guid>.GetConnections(userId))
{
dateTime = SystemTime.Now().ToString();
_alertHubContext.Clients.Client(connection).addAlert(alert.Id.Shrink(), title, url, dateTime);
}
其他解决方案都描述了开发人员在连接客户端方法之前调用 start()
的情况。但是,我不会那样做。
服务器方法调用客户端方法时,控制台完全没有变化。
我相信我已经将范围缩小到:
Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<AlertHub>().Clients.All.hi();
我创建了一个名为 hi()
的基本客户端方法,它只是弹出一个警报。这甚至不起作用。
似乎在使用 GetHubContext
方法调用客户端方法时未与客户端代码建立连接。
事实证明,我的客户端函数没有被调用,因为我使用的是自定义依赖项解析器。显然,如果您在 OwinStartup
class 中设置 DependencyResolver
,它会以某种方式阻止调用客户端方法。
因此,moving it 到 Global.asax,或更具体地说 Application_Start
事件,解决了问题:
protected void Application_Start()
{
GlobalHost.DependencyResolver = new SignalrDefaultDependencyResolver(UnityConfig.Container);
}
我知道有人问过这个问题several times,但其他人发布的解决方案不是我的解决方案。所以,我希望有另一个解决这个问题的答案。
在服务器上对此进行调试时,它会找到合适的客户端并调用 "addAlert" 方法。此 Javascript 初始化正常并且 "Alert Ready" 消息写入控制台。
服务器和客户端代码上都没有错误消息:
$(function () {
// enable logging for debugging
$.connection.hub.logging = true;
// Declare a proxy to reference the hub.
var hub = $.connection.alertHub;
hub.client.addAlert = function (id, title, url, dateTime) {
console.log(title);
};
$.connection.hub.start().done(function () {
console.log("Alert Ready");
});
});
[09:12:51 GMT-0600 (Central America Standard Time)] SignalR: Client subscribed to hub 'alerthub'. jquery.signalR-2.0.0.min.js:8 [09:12:51 GMT-0600 (Central America Standard Time)] SignalR: Negotiating with '/signalr/negotiate?connectionData=%5B%7B%22name%22%3A%22alerthub%22%7D%5D&clientProtocol=1.3'. jquery.signalR-2.0.0.min.js:8 [09:12:51 GMT-0600 (Central America Standard Time)] SignalR: Connecting to websocket endpoint 'ws://mysite.local/signalr/connect?transport=webSockets&connectionToken=c…OZxqiRQKOc%3D&connectionData=%5B%7B%22name%22%3A%22alerthub%22%7D%5D&tid=4'. jquery.signalR-2.0.0.min.js:8 [09:12:51 GMT-0600 (Central America Standard Time)] SignalR: Websocket opened. jquery.signalR-2.0.0.min.js:8 [09:12:51 GMT-0600 (Central America Standard Time)] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332 and a connection lost timeout of 20000.
上面的日志就是所有发生的事情,即使在从服务器调用客户端函数之后也是如此:
string dateTime;
foreach(var connection in ConnectionMapping<Guid>.GetConnections(userId))
{
dateTime = SystemTime.Now().ToString();
_alertHubContext.Clients.Client(connection).addAlert(alert.Id.Shrink(), title, url, dateTime);
}
其他解决方案都描述了开发人员在连接客户端方法之前调用 start()
的情况。但是,我不会那样做。
服务器方法调用客户端方法时,控制台完全没有变化。
我相信我已经将范围缩小到:
Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<AlertHub>().Clients.All.hi();
我创建了一个名为 hi()
的基本客户端方法,它只是弹出一个警报。这甚至不起作用。
似乎在使用 GetHubContext
方法调用客户端方法时未与客户端代码建立连接。
事实证明,我的客户端函数没有被调用,因为我使用的是自定义依赖项解析器。显然,如果您在 OwinStartup
class 中设置 DependencyResolver
,它会以某种方式阻止调用客户端方法。
因此,moving it 到 Global.asax,或更具体地说 Application_Start
事件,解决了问题:
protected void Application_Start()
{
GlobalHost.DependencyResolver = new SignalrDefaultDependencyResolver(UnityConfig.Container);
}