【问题标题】:signalr how i can i post a message from server to caller信号器我如何将消息从服​​务器发布到呼叫者
【发布时间】:2016-08-27 06:19:03
【问题描述】:

我正在使用 Signalr 1.1.4,因为我仍在使用 .net4,因此无法升级到 Signalr 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");

这甚至可能吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    因为 Hub 类的实例是瞬态的,所以不能使用它们 保持从一个方法调用到下一个方法调用的状态。每次 服务器接收来自客户端的方法调用,您的新实例 Hub 类处理消息。通过多个保持状态 连接和方法调用,使用其他一些方法,例如 数据库,或 Hub 类上的静态变量,或不同的类 不是从 Hub 派生的。如果您将数据持久保存在内存中,请使用 Hub 类上的静态变量等方法,数据将是 应用域回收时丢失。

    然后:

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

    您可以获取您的中心的上下文:GlobalHost.ConnectionManager.GetHubContext&lt;YourHub&gt;()

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

    context.Clients.All.YourMethod(params);
    

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

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

    希望它会有所帮助。

    【讨论】:

    • 我发现在我的进程运行时会生成一个客户端的连接ID。我想我可以使用 ajax 将它传递给我的控制器,以便使用 clients.client (connectionId)
    • 是的,就像一个选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多