我创建了一个简单的测试应用程序来重现我在主应用程序中遇到的问题。
我有以下集线器类:
[HubName("testHub")]
public class TestHub : Hub
{
public TestHub()
{
System.Diagnostics.Debug.WriteLine("TestHub instantiated");
}
public void RunMe()
{
System.Diagnostics.Debug.WriteLine("Client Started");
}
public static void Notify(string msg)
{
var hubContext = GlobalHost.ConnectionManager.GetHubContext<TestHub>();
hubContext.Clients.All.notify("Hello!");
}
}
我的测试网页是:
<form action="javascript: void(0)" method="post">
<input type="button" value="Do It!" onclick="hitHub()"/>
</form>
<div id="error"></div>
<script type="text/javascript">
var tHub;
$(document).ready(function () {
tHub = $.connection.testHub;
tHub.notify = function (msg) {
alert(msg);
}
$.connection.hub.start().done(function () {
tHub.server.runMe();
});
});
function hitHub() {
$.ajax({
type: "POST",
url: "@Url.Content("~/Hub/Test")" ,
success: function (data, textStatus, jqXHR) {
},
error: function (data, textStatus, jqXHR) {
$("#error")[0].innerHTML = data.responseText;
alert("Error notifying hub.");
}
});
}
</script>
最后,我的HubController:
public class HubController : Controller
{
[AcceptVerbs(HttpVerbs.Post)]
public void Test()
{
TestHub.Notify("Got it!");
}
}
在我的Application_Start中,我调用了RouteTable.Routes.MapHubs();
集线器得到实例化。然后,对runMe()的调用将传递给服务器。一切正常。
失败的地方是我点击“Do It!”按钮。调用hitHub()并调用我的HubController.Test()方法。 TestHub.Notify(“得到它!”)执行没有任何错误,但客户端没有任何反应。
我错过了什么?
更新1:根据JcFx的回答,更改了上面的javascript,以便在调用$ .connection.hub.start()之前设置tHub.notify。然而,问题仍然存在。
更新2: 小提琴手看到了什么:
更新3:当我追踪到MessageBus.Publish()调用时,我注意到主题没有订阅,因此该主题永远不会被安排。我不确定我应该在什么时候检查订阅...
答案 0 :(得分:3)
您使用了错误的语法:
var tHub;
$(document).ready(function () {
tHub = $.connection.testHub;
tHub.client.notify = function (msg) {
alert(msg);
}
$.connection.hub.start().done(function () {
tHub.server.runMe();
});
});
请注意集线器上的 .client 属性以注册回调。