使用SignalR更新页时时面动态

最近的新项目中有个需求,要求用户在用户抢先体验中参加了活动,在其他的页面中的动态滚动栏中可以立刻显示,最新的活动参与信息。

以前可以用Javascript在前台使用长轮询的方法,这次使用了微软的一个开源库SignalR,SignalR可以在ASP .NET 的Web项目中实现实时通信。

一般情况下,SignalR会使用Javascript的长轮询( long polling),实现客户端和服务端通信。在WebSockets出现以后,SignalR支持WebSockets通信。SignalR使用了服务端的任务并行处理技术以提高服务器的扩展性。

看看我是如何实现这个功能的,注意项目一定要选择.net Framework4.5及以上

1.首先使用NuGet获取 Microsoft ASP.NET SignalR,项目中就会自动引入相关的dll和js

2.创建数据模型类(这里我使用一个自定义的MessageRepertory类模拟数据仓库)

public class MessageRepertory
    {

        public string Name { get; set; }
        public string Msg { get; set; }
        public static List<MessageRepertory> m = new List<MessageRepertory>();//模拟数据源
        public static List<MessageRepertory> getMessage()
        {

            if (m != null)
                return m;
            else
                return null;

        }
         public static List<MessageRepertory> AddMessage()
        {
            Random r = new Random();
            MessageRepertory A = new MessageRepertory { Name = "用户" + r.Next(1, 100).ToString(), Msg = "随机数" + r.Next(1, 100).ToString() };
            m.Add(A);
            return m;

        }
    }
}

3.创建MessageHub类

 public class MessageHub : Hub
    {
        public List<MessageRepertory> Send()
        {
            List<MessageRepertory> m = MessageRepertory.getMessage();
            string messages = JsonConvert.SerializeObject(m);
            return m;
        }

    }

4创建控制器MessageController

  public class MessageController : Controller
    {
        //
        // GET: /Chat/
        public ActionResult Index()
        {
            return View();
        }
        public ActionResult Add()//模拟抢先体验
        {
             return View();
        }
        public ActionResult Update()
        {
           var a= MessageRepertory.AddMessage();
           GlobalHost.ConnectionManager.GetHubContext<MessageHub>().Clients.All.updateInfo();
            return Content("发送成功");
        }
    }

5.创建一个启动类,映射SignalR

[assembly: OwinStartupAttribute(typeof(SignalRTest.Startup))]
namespace SignalRTest
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
            app.MapSignalR();//映射
        }
    }
}

6.创建相关视图

A   index视图

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <script src="~/Scripts/jquery-1.10.2.min.js"></script>
    <script src="~/Scripts/jquery.signalR-2.1.2.min.js"></script>
    <script src="/signalr/hubs"></script><!--由SignalR动态载入.-->
<style type="text/css"> .container { background-color: #99CCFF; border: thick solid #808080; padding: 20px; margin: 20px; } </style> <script type="text/javascript"> $(function () { var message= $.connection.messageHub function showmessage() { message.server.send().done(function (messages) { var dis = $("#discussion"); dis.html(""); $.each(messages, function (index,item) { dis.append('<li><strong>' + item.Name + '</strong>:&nbsp;&nbsp;' + item.Msg + '</li>'); }); }); } $.extend(message.client, { updateInfo: function () { return showmessage(); } }); $.connection.hub.start().pipe(showmessage);//开启客户端SignalR,并首次运行init }); </script> </head> <body> <div class="container">
<ul id="discussion"></ul> </div> </body> </html>

B Add视图

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Add</title>
    <script src="~/Scripts/jquery-1.10.2.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#up").click(function () {

                $.get("Update", function (data) {
                    alert(data);

                });


            });

        });


    </script>
</head>
<body>
    <div> 
        <input id="up" type="button" value="update" />
    </div>
</body>
</html>

运行效果:

原文地址:https://www.cnblogs.com/jeemly/p/4067351.html