我一直在研究如何找到SignalR实现的工作示例,其中状态更新仅 发送到浏览器选项卡的实例。我的应用程序提取Web数据,该过程需要花费大量时间。
我能够发送状态更新,但仅限于打开网页的所有用户。
//Server side (works just fine)
public class SendCustomText : Hub
{
public string myStatus;
public void CurrentStatus()
{
var context = GlobalHost.ConnectionManager.GetHubContext<SendCustomText>();
context.Clients.All.setStatus(myStatus);
}
}
//Client side
<script type="text/javascript">
$(function () {
//Declare a proxy to the reference hub
var currentStatus = $.connection.sendCustomText;
currentStatus.client.setStatus = function (value) {
$('#signalr_french_status').text(value.toString());
}
$.connection.hub.start().done(function () {
$('pandora_french_panel_extract_button').click(function () {
currentStatus.server.send();
})
})
$.connection.hub.disconnected(function () {
$.connection.hub.start();
})
})
然而,我需要的是一种仅在打开的选项卡中更新进度的方法。登录用户可以打开另一个选项卡并处理另一个作业,新选项卡应显示自己的进度。
我尝试成功获取连接ID客户端,然后通过AJAX将其传递给服务器代码。我需要你的帮助,在集线器中使用连接ID。
context.Clients.Client(connectionID).setStatus();
答案 0 :(得分:0)
我可以自己解决问题。 (我最初做了一个非常基本的错误。第一次,我使用public string myConnectionID
,即没有static
关键字。)
public class SendCustomText : Hub
{
public string myStatus;
public static string myConnectionID;
public void CurrentStatus()
{
var context = GlobalHost.ConnectionManager.GetHubContext<SendCustomText>();
context.Clients.Client(myConnectionID).setStatus(myStatus);
}
public override System.Threading.Tasks.Task OnConnected()
{
myConnectionID = Context.ConnectionId;
return base.OnConnected();
}
}