你可以在不使用Knockout的情况下使用SignalR吗?

时间:2018-04-06 16:09:04

标签: c# asp.net model-view-controller knockout.js signalr

我需要的是在其他人创建警报时更新包含警报的页面。不一定是实时的,但每10秒左右最少。它还需要在显示新内容时闪烁选项卡,以便用户知道如果当前位于不同页面上的内容已更新。谢谢。

1 个答案:

答案 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);                
            }

我希望这有帮助!