Asp.net mvc ASP.NET MVC 4中的服务器到客户端消息未通过SignalR
我创建了一个简单的测试应用程序来重现我在主应用程序中遇到的问题 我有以下集线器类:Asp.net mvc ASP.NET MVC 4中的服务器到客户端消息未通过SignalR,asp.net-mvc,signalr,Asp.net Mvc,Signalr,我创建了一个简单的测试应用程序来重现我在主应用程序中遇到的问题 我有以下集线器类: [HubName("testHub")] public class TestHub : Hub { public TestHub() { System.Diagnostics.Debug.WriteLine("TestHub instantiated"); } public void RunMe() { System.Diagnostics
[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!");
}
}
在我的应用程序_Start中,我调用RouteTable.Routes.MapHubs()
中心将被实例化。然后,对runMe()的调用被传递到服务器。这一切都很好
当我点击“做它!”按钮时,它失败了。调用hitHub()并调用my HubController.Test()方法。Notify(“Got it!”)在没有任何错误的情况下执行,但是在客户机上什么也没有发生
我错过了什么
更新1:根据JcFx的回答,更改了上面的javascript,以便在调用$.connection.hub.start()之前设置tHub.notify。然而,问题依然存在
更新2:
小提琴手看到的:
更新3:当我跟踪到MessageBus.Publish()调用时,我注意到该主题没有订阅,因此该主题从未被安排。我不确定应该在什么时候检查订阅…您使用了错误的语法:
var tHub;
$(document).ready(function () {
tHub = $.connection.testHub;
tHub.client.notify = function (msg) {
alert(msg);
}
$.connection.hub.start().done(function () {
tHub.server.runMe();
});
});
注意集线器上的.client属性以注册回调。另一个想法:尝试调用
GlobalHost.ConnectionManager.GetHubContext
,然后从非静态函数调用notify
客户端代码。我不确定hubcontext是否存在,或者在静态方法中是否是相同的上下文。请尝试。它也不起作用。我很欣赏这些想法……第一个(函数顺序)肯定是您需要解决的问题。我不知道还有什么可能是错误的-我有几乎相同的代码,它工作得很好。抱歉没用…谢谢,大卫。我希望你能插话回答,当然,你回答了。我认为这是最近发生的变化,因为web上的大多数示例都没有使用这种语法。不管怎样,谢谢。如果有疑问,请查看文档。它们是最新的。你不会相信我在文档中对这一点隐瞒了多少次。谢谢你,大卫!那么如何只向特定用户发送消息呢?我试过hubContext.Clients.User(用户名).notify(消息)代码>但这不起作用。@imdadhusenhubContext.Clients.User(用户名)。notify(消息)代码>这是可行的,但首先检查本文
public class HubController : Controller
{
[AcceptVerbs(HttpVerbs.Post)]
public void Test()
{
TestHub.Notify("Got it!");
}
}
var tHub;
$(document).ready(function () {
tHub = $.connection.testHub;
tHub.client.notify = function (msg) {
alert(msg);
}
$.connection.hub.start().done(function () {
tHub.server.runMe();
});
});