signalr我怎样才能将消息从服​​务器发布给呼叫者

时间:2016-05-02 13:06:24

标签: c# asp.net-mvc-4 signalr

我正在使用Signalr 1.1.4,因为我仍在使用.net4,因此无法升级到信号器2。

基本上我想将一条消息从服务器发布到呼叫者,以避免将消息发送到任何未启动该过程的客户端。

我的集线器类看起来像这样

public class UpdateHub : Hub
{
    /// <summary>
    /// Sends the message.
    /// </summary>
    /// <param name="progressMessage">The progress message.</param>
    public void SendMessage(string progressMessage)
    {
        Clients.Client(Context.ConnectionId).sendMessage(string.Format(progressMessage));
    }
}

我的javascript看起来像这样

    // get handle to subscriptionUpload hub generated by SignalR 
    var updateHub = $.connection.UpdateHub;

    // establish the connection to the server and start server-side operation
    $.connection.hub.start();

    updateHub.client.sendMessage = function (message)
    {
        $("container").empty();
        $("container").append(message);
    }

现在在我的控制器动作方法中我想做类似的事情

UpdateHub hub = new UpdateHub();
hub.SendMessage("process has started");

//continue on with long process

hub.SendMessage("process has ended");

这甚至可能吗?

1 个答案:

答案 0 :(得分:2)

我们可以在文档documentation中找到:

  

您没有实例化Hub类或从您自己的方法调用其方法   服务器上的代码;所有这些都由SignalR Hubs为您完成   管道。 SignalR每次都会创建一个Hub类的新实例   它需要处理Hub操作,例如客户端连接时,   断开连接,或对服务器进行方法调用。

     

由于Hub类的实例是瞬态的,因此您无法使用它们   保持状态从一个方法调用到下一个。每一次   服务器接收来自客户端的方法调用,一个新的实例   Hub类处理消息。通过多重维持状态   连接和方法调用,使用一些其他方法,如a   数据库,或Hub类上的静态变量,或其他类   这不是来自Hub。如果您将数据保留在内存中,请使用   方法如Hub类上的静态变量,数据将是   应用程序域回收时丢失。

然后:

  

如果要根据自己运行的代码向客户端发送消息   在Hub类之外,您无法通过实例化Hub类来实现   例如,你可以通过获取SignalR的引用来实现   Hub类的上下文对象

您可以获取集线器的上下文:GlobalHost.ConnectionManager.GetHubContext<YourHub>()

然后您可以使用它来调用客户端上的方法,如下所示:

context.Clients.All.YourMethod(params);

context.Clients.Client(someConnectionID).YourMethod(params);

但在这种情况下,您无法在此方法中使用Context.ConnectionId,因为您没有直接连接到您的中心。在这种情况下,您需要将连接存储在某处(静态变量,缓存,数据库等),然后使用它来确定应该调用哪个客户端。

希望它会有所帮助。