我需要的是在其他人创建警报时更新包含警报的页面。不一定是实时的,但每10秒左右最少。它还需要在显示新内容时闪烁选项卡,以便用户知道如果当前位于不同页面上的内容已更新。谢谢。
答案 0 :(得分:1)
我从来没有尝试过使用signalR敲击,这就是我们用近0延迟来做的事情。
在我们的母版页中,我们包含了jquery signalR库
在下面,我们告诉它包含signalR自动生成的脚本
我们的Hub类看起来像这样。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
namespace CHSI.Shared.APIs
{
[HubName("applicationMessageHub")]
public class ApplicationMessageHub : Hub
{
private readonly TimeSpan _updateInterval = TimeSpan.FromMilliseconds(5000);
private IList< DSIDGroup> DSIDGroups = new List<DSIDGroup>();
public ApplicationMessageHub()
{
}
public void CheckMessages(object state)
{
GetMessages();
}
public Models.ApplicationMessage GetCurrentMessage(int DSID)
{
Models.ApplicationMessage currentMessage = null;
return currentMessage;
}
public override Task OnConnected()
{
string DSID = Context.QueryString["DSID"];
if (!string.IsNullOrEmpty(DSID))
{
Groups.Add(Context.ConnectionId, DSID);
DSIDGroup currentGroup = (from g in this.DSIDGroups where g.DSID == DSID select g).FirstOrDefault();
if (currentGroup != null)
{
currentGroup.ConnecedIDs.Add(Context.ConnectionId);
}
else
{
currentGroup = new DSIDGroup();
currentGroup.DSID = DSID;
currentGroup.ConnecedIDs.Add(Context.ConnectionId);
this.DSIDGroups.Add(currentGroup);
}
}
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
foreach (var DSIDgroup in DSIDGroups)
{
if (DSIDgroup.ConnecedIDs.Contains(Context.ConnectionId))
{
DSIDgroup.ConnecedIDs.Remove(Context.ConnectionId);
if (DSIDgroup.ConnecedIDs.Count == 0)
{
DSIDGroups.Remove(DSIDgroup);
}
break;
}
}
return base.OnDisconnected(stopCalled);
}
public void BroadcastMessage(Models.ApplicationMessage message)
{
Clients.All.SendMessage(message);
}
public void clearCache(int DSID)
{
Clients.Group(DSID.ToString()).clearCache();
}
public Models.ApplicationMessage GetMessages()
{
foreach (var group in this.DSIDGroups)
{
Models.ApplicationMessage currentMessage = GetCurrentMessage(Convert.ToInt32(group.DSID));
if (currentMessage != null)
{
Clients.Group(group.DSID).SendMessage(currentMessage);
}
}
return null;
//return _applicationMessage.GetCurrentMessage();
}
}
public class DSIDGroup
{
public string DSID {get;set;}
public IList<string> ConnecedIDs { get;set; }
public DSIDGroup()
{
this.ConnecedIDs = new List<string>();
}
}
}
此类根据用户的帐户(DSID)处理将用户分组到群组中,但您可以按聊天室对用户进行分组,而不是根据其他方法对用户进行分组。
我们也在代码库中的其他位置调用javascript函数。
var context = Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<CHSI.Shared.APIs.ApplicationMessageHub>();
List<string> dsids = new List<string>();
dsids.Add(CHSI.Shared.Models.ConnectionManager.Current().CurrentDSID.Value.ToString());
context.Clients.Groups(dsids).clearCache();
有一个叫做SendMessage的javascript函数和另一个名为clearCache的函数来处理这些调用。 他们的定义是这样的。
applicationMessageHub.client.sendMessage = function (message) {
alert(message.SummaryMessage);
};
applicationMessageHub.client.clearCache = function () {
localStorage.removeItem("companiesCache");
Class.loadPage(Class);
}
我希望这有帮助!