无法使用 SignalR 读取未定义的 属性 'client'
Cannot read property 'client' of undefined using SignalR
我整天都在为此工作,但运气不佳。
我也尝试了(几乎)每一个 SO 问题,但我没有让它工作...
我是 运行 网络 api,使用非常简单的 SignalR 推送消息和单独的简单前端来显示此推送消息。
在我的例子中,推送消息不断变化。
index.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>test app</title>
<script src="scripts/jquery-2.1.4.js"></script>
<script src="scripts/jquery.signalR-2.2.0.js"></script>
<script src="/signalr/hubs"></script>
</head>
<body>
<div id="testElm">TEST: </div>
<script type="text/javascript">
$(document).ready(function () {
$.connection.hub.url = "http://localhost:55833/signalr";
var hub = $.connection.displayHub;
hub.client.pushMessage = function (response) {
$('#testElm').text(response);
};
$.connection.hub.start();
});
</script>
</body>
</html>
我的中心class
public class DisplayHub : Hub
{
public DisplayHub() : this(GlobalHost.ConnectionManager.GetHubContext<DisplayHub>().Clients) { }
public DisplayHub(IHubConnectionContext<dynamic> clients)
{
}
public void PushMessage(string message)
{
// generate random number and send it every 1s for testing
Clients.All.pushMessage(randomNumber);
}
}
当运行
$.connection.hub.logging = true;
这是我得到的日志
2015-06-15 16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: Auto detected cross domain url.
2015-06-15 16:44:15.314 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: Negotiating with 'http://localhost:55833/signalr/negotiate?clientProtocol=1.5'.
2015-06-15 16:44:15.434 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: webSockets transport starting.
2015-06-15 16:44:15.435 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: Connecting to websocket endpoint 'ws://localhost:55833/signalr/connect?transport=webSockets&clientProtocol=1.5&connectionToken=h7UAGOrF6RP8JUE%2F82K84E8NSZOd8jsuijsCQ2Jyh1jRi7zXmIpoVnIP9tjEjlcWvxihtZBNt6BYdaAW2jp574B5nXS%2BJFEW%2F%2BdixsiV0yu3YwaN5ERh6yhYtkvztQSQ&tid=5'.
2015-06-15 16:44:15.451 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: Websocket opened.
2015-06-15 16:44:15.510 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: webSockets transport connected. Initiating start request.
2015-06-15 16:44:15.518 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: The start request succeeded. Transitioning to the connected state.
2015-06-15 16:44:15.518 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000
而且我不断得到
Cannot read property 'client' of undefined
- 检查 "hub" 将显示集线器未定义 ...
- 浏览 http://localhost:55833/signalr/hubs 我可以看到正在创建的服务器上的集线器。
- 暂时合并 API 和前端,一切正常,但如果我将它们分开,我将出现上述错误...
- 使用 [HubName("displayHub")] 属性没有任何区别。
- 根据上面的日志正确设置了 CORS
知道是什么导致了错误吗?有什么方法可以进一步调试 signalR 以了解发生了什么?
更新 1:
阅读 ASP.NET SignalR Hubs API 指南后 - JavaScript http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client
我已根据没有生成的代理段落将我的代码更改为:
var conn = $.hubConnection("http://localhost:55833/signalr");
var hubProxy = conn.createHubProxy('displayHub');
hubProxy.on('pushMessage', function (response) {
$('#testElm').text(response);
});
conn.start();
它开始起作用...有人可以解释为什么吗?
根据您的问题,我了解到您有 2 个不同的客户端和服务器应用程序,并且您正在使用 CORS。您第一次尝试失败的原因是您没有将动态 SignalR 端点作为服务器应用程序的目标。你应该改变这个:
<script src="/signalr/hubs"></script>
进入这个:
<script src="http://localhost:55833/signalr/hubs"></script>
原因是,端点动态生成 Javascript 表示集线器形状的代码,因此需要在集线器所在的应用程序(即服务器)上调用它。
如果您的 signalr 项目未在运行时加载,您也可能会遇到此错误。例如它缺少一个程序集。
不需要完整的主机前缀,因此包括 /signalr/hubs 应该就足够了。
我整天都在为此工作,但运气不佳。 我也尝试了(几乎)每一个 SO 问题,但我没有让它工作...
我是 运行 网络 api,使用非常简单的 SignalR 推送消息和单独的简单前端来显示此推送消息。 在我的例子中,推送消息不断变化。
index.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>test app</title>
<script src="scripts/jquery-2.1.4.js"></script>
<script src="scripts/jquery.signalR-2.2.0.js"></script>
<script src="/signalr/hubs"></script>
</head>
<body>
<div id="testElm">TEST: </div>
<script type="text/javascript">
$(document).ready(function () {
$.connection.hub.url = "http://localhost:55833/signalr";
var hub = $.connection.displayHub;
hub.client.pushMessage = function (response) {
$('#testElm').text(response);
};
$.connection.hub.start();
});
</script>
</body>
</html>
我的中心class
public class DisplayHub : Hub
{
public DisplayHub() : this(GlobalHost.ConnectionManager.GetHubContext<DisplayHub>().Clients) { }
public DisplayHub(IHubConnectionContext<dynamic> clients)
{
}
public void PushMessage(string message)
{
// generate random number and send it every 1s for testing
Clients.All.pushMessage(randomNumber);
}
}
当运行
$.connection.hub.logging = true;
这是我得到的日志
2015-06-15 16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: Auto detected cross domain url.
2015-06-15 16:44:15.314 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: Negotiating with 'http://localhost:55833/signalr/negotiate?clientProtocol=1.5'.
2015-06-15 16:44:15.434 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: webSockets transport starting.
2015-06-15 16:44:15.435 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: Connecting to websocket endpoint 'ws://localhost:55833/signalr/connect?transport=webSockets&clientProtocol=1.5&connectionToken=h7UAGOrF6RP8JUE%2F82K84E8NSZOd8jsuijsCQ2Jyh1jRi7zXmIpoVnIP9tjEjlcWvxihtZBNt6BYdaAW2jp574B5nXS%2BJFEW%2F%2BdixsiV0yu3YwaN5ERh6yhYtkvztQSQ&tid=5'.
2015-06-15 16:44:15.451 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: Websocket opened.
2015-06-15 16:44:15.510 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: webSockets transport connected. Initiating start request.
2015-06-15 16:44:15.518 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: The start request succeeded. Transitioning to the connected state.
2015-06-15 16:44:15.518 jquery.signalR-2.2.0.js:81 [16:44:15 GMT+0100 (GMT Daylight Time)] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000
而且我不断得到
Cannot read property 'client' of undefined
- 检查 "hub" 将显示集线器未定义 ...
- 浏览 http://localhost:55833/signalr/hubs 我可以看到正在创建的服务器上的集线器。
- 暂时合并 API 和前端,一切正常,但如果我将它们分开,我将出现上述错误...
- 使用 [HubName("displayHub")] 属性没有任何区别。
- 根据上面的日志正确设置了 CORS
知道是什么导致了错误吗?有什么方法可以进一步调试 signalR 以了解发生了什么?
更新 1:
阅读 ASP.NET SignalR Hubs API 指南后 - JavaScript http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client 我已根据没有生成的代理段落将我的代码更改为:
var conn = $.hubConnection("http://localhost:55833/signalr");
var hubProxy = conn.createHubProxy('displayHub');
hubProxy.on('pushMessage', function (response) {
$('#testElm').text(response);
});
conn.start();
它开始起作用...有人可以解释为什么吗?
根据您的问题,我了解到您有 2 个不同的客户端和服务器应用程序,并且您正在使用 CORS。您第一次尝试失败的原因是您没有将动态 SignalR 端点作为服务器应用程序的目标。你应该改变这个:
<script src="/signalr/hubs"></script>
进入这个:
<script src="http://localhost:55833/signalr/hubs"></script>
原因是,端点动态生成 Javascript 表示集线器形状的代码,因此需要在集线器所在的应用程序(即服务器)上调用它。
如果您的 signalr 项目未在运行时加载,您也可能会遇到此错误。例如它缺少一个程序集。 不需要完整的主机前缀,因此包括 /signalr/hubs 应该就足够了。