SignalR +通过操作方法将消息发布到Hub

我正在使用SignalR的中心function( https://github.com/SignalR/SignalR )向所有订阅的客户端发布消息:

public class NewsFeedHub : Hub public void Send(string channel, string content) { Clients[channel].addMessage(content); } 

当通过Javascript调用“Send”时,这很好,但是我也想让Web应用程序发布消息(从ASP.NET MVC操作方法中)。 我已经尝试实例化一个新对象ob NewsFeedHub并调用Send方法,但是这会导致错误(因为Hub的底层“连接”未设置)。 有没有办法使用集线器没有连接?

请注意,自问这个问题以来,SignalR API已经多次改变了。 有一些机会可能会过时。 这并不意味着他们应该在撰写本文时是正确的

还有另一个更新的答案,如在SignalR Wiki中看到的

C#

 Public ActionResult MyControllerMethod() { var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); context.Clients.All.methodInJavascript("hello world"); // or context.Clients.Group("groupname").methodInJavascript("hello world"); } 

vb.net

 Public Function MyControllerMethod() As ActionResult Dim context = GlobalHost.ConnectionManager.GetHubContext(Of MyHub)() context.Clients.All.methodInJavascript("hello world") '' or context.Clients.Group("groupname").methodInJavascript("hello world") End Function 

更新

此代码已更新。 按照http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server进行更改。;

如果你正在使用DI容器

如果您正在使用DI容器来连接集线器,请从容器中获取IConnectionManager ,然后在该连接GetHubContext上调用GetHubContext

2017年2月,简短而简单的解决scheme

为了解决这个问题,我通常按以下方式devise我的中心:

 public class NewsFeedHub : Hub { private static IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<NewsFeedHub>(); // Call this from JS: hub.client.send(channel, content) public void Send(string channel, string content) { Clients.Group(channel).addMessage(content); } // Call this from C#: NewsFeedHub.Static_Send(channel, content) public static void Static_Send(string channel, string content) { hubContext.Clients.Group(channel).addMessage(content); } } 

所以很容易从Javascript和后端代码调用。 这两种方法在客户端产生相同的事件。

更新这个答案也是旧的! SignalR的公共API似乎在不断变化。 蒂姆·B·詹姆斯截至2012年7月有新的,适当的API使用。

Mike目前接受的答案是旧的,不再适用于最新版本的SignalR。

这是一个更新的版本,展示了如何从MVC控制器动作发布消息到集线器:

 public ActionResult MyControllerMethod() { // Important: .Resolve is an extension method inside SignalR.Infrastructure namespace. var connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>(); var clients = connectionManager.GetClients<MyHub>(); // Broadcast to all clients. clients.MethodOnTheJavascript("Good news!"); // Broadcast only to clients in a group. clients["someGroupName"].MethodOnTheJavascript("Hello, some group!"); // Broadcast only to a particular client. clients["someConnectionId"].MethodOnTheJavascript("Hello, particular client!"); } 

继续从DDan的答案你可以创build一个重载的静态方法,并保持一种方法的公共逻辑 – 我使用这种模式

 public class ChatHub : Hub { private static IHubConnectionContext<dynamic> GetClients(ChatHub chatHub) { if (chatHub == null) return GlobalHost.ConnectionManager.GetHubContext<ChatHub>().Clients; else return chatHub.Clients; } // Call from JavaScript public void Send(string message) { Send(message, this); } // Call from C# eg: Hubs.ChatHub.Send(message, null); public static void Send(string message, ChatHub chatHub) { IHubConnectionContext<dynamic> clients = GetClients(chatHub); // common logic goes here clients.All.receiveSend(message); } } 

然后从你的控制器,你可以使用

 Hubs.ChatHub.Send(arg1, null);