我正在使用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");
这甚至可能吗?
答案 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
,因为您没有直接连接到您的中心。在这种情况下,您需要将连接存储在某处(静态变量,缓存,数据库等),然后使用它来确定应该调用哪个客户端。
希望它会有所帮助。