1、A SignalR 实现服务端消息推送到 Web端 之前的文章介绍过 A SignalR, ASP .NET SignalR是一个 ASP .NET 下的类库,可以在 ASP .NET 的 Web项目中实现实时通信 . 今天我们来实现服务端消息推送到 Web端 , 首先回顾一下它抽象层次图是这样的 : 实际上 A SignalR 2 实现 服务端消息推送到 Web端 , 更加简单 . 为了获取更好的可伸缩性 , 我们引入消息队列 , 看如下基本流程图 : 消息队列 MQ监听 , 在 Web site 服务端一收到消息 ,马上通过 Signalr 推送广播到客户端 . 创建 ASP.NET MV
2、C WEB APP, 从 NuGet 安装 SignalR 2.12 Install-Package Microsoft.AspNet.SignalR 具体实现代码 ,是这样的 ,我们增加一个空的 Hub: public class FeedHub : Hub public void Init() 是简单的消息模型 , 标题与正文属性 : Serializable public class PushMessageModel public int Id get; set; public string MSG_TITLE get; set; public string MSG_CONTENT ge
3、t; set; 服务端推送具体类 ,记录日志 , 创建消息队列实例 ,监听 , 等待收取消息 . 这里我们使用的是 AcitveMQ的 .net客户端 . ActiveMQListenAdapter是一个封装过的对象 . public class MQHubsConfig private static ILogger log = new Logger(“MQHubsConfig“); / / Registers the mq listen and hubs. / public static void RegisterMQListenAndHubs() var activemq = Megado
4、tnet.MessageMQ.Adapter.ActiveMQListenAdapter.Instance(MQConfig.MQIpAddress, MQConfig.QueueDestination); activemq.MQListener += m = log.InfoFormat(“从 MQ收到消息 0“, m.MSG_CONTENT); GlobalHost.ConnectionManager.GetHubContext().Clients.All.receive(m); ; activemq.ReceviceListener(); 上面有一句关键代码GlobalHost.Conn
5、ectionManager.GetHubContext().Clients.All.receive(m); 这里使用了 GetHubContext方法后 ,直接来广播消息 . 需要在 MVCApplication下加载 : public class MvcApplication : System.Web.HttpApplication protected void Application_Start() AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
6、RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); MQHubsConfig.RegisterMQListenAndHubs(); 同时 需要增加一个 Starup.cs, 用于 Owin assembly: OwinStartup(typeof(RealTimeApp.Startup) namespace RealTimeApp public class Startup public void Configuration(IAppBuilder ap
7、p) / Any connection or hub wire up and configuration should go here app.MapSignalR(); 接下来是客户端 App.js: function App() var init = function () Feed(); $.connection.hub.logging = true; $.connection.hub.start() .done(function() console.log(“Connected!“); $(document).trigger(“Connected“); ) .fail(function
8、() console.log(“Could not Connect!“); ); ; init(); ; Feed.js 具体与 SignalR.js通信 , 创建名为 receive的 function, 与服务端对应 function Feed() var chat = undefined; var init = function () / Reference the auto-generated proxy for the hub. chat = $.connection.feedHub; / Create a function that the hub can call back to
9、 display messages. chat.client.receive = function (item) var selector = “ul.feed-list lidata-id=“ + item.Id + “; if (!($(selector).length 0) $(“ul.feed-list“).prepend($(“.feed-template“).render(item); $(“ul.feed-list li:gt(3)“).remove(); $.messager.show( title: Tips, msg: item.MSG_CONTENT, showType:
10、 show ); ; / Start the connection. $.connection.hub.start().done(function () chat.server.init(); ); ; init(); ; 上面的 javascript代码与服务端有通信 , 具体看如下图 : 在 Index.cshtml, 我们需要引用 SignalR客户端 JS, 放置hubs, 这里我们使用了 jsrender, easyui.js 来呈现推送的消息 . model dynamic section Scripts Scripts.Render(“/Scripts/project.js“) $(document).ready(function () var app = new App(); ); Feed Message