




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ASignalR实现效劳端消息推送到Web端之前的文章介绍过ASignalR,
ASP.NETSignalR是一个ASP.NET下的类库,可以在ASP.NET的Web工程中实现实时通信.
今天我们来实现效劳端消息推送到Web端,
首先回忆一下它抽象层次图是这样的:实际上ASignalR2实现效劳端消息推送到Web端,更加简单.为了获取更好的可伸缩性,我们引入消息队列,看如下根本流程图:消息队列MQ监听,在Website效劳端一收到消息,马上通过Signalr推送播送到客户端.
创立ASP.NETMVCWEBAPP,
从NuGet安装SignalR2.12Install-Package具体实现代码,是这样的,我们增加一个空的Hub:publicclassFeedHub:Hub{publicvoidInit(){}}是简单的消息模型,标题与正文属性:
[Serializable]publicclassPushMessageModel{publicintId{get;set;}publicstringMSG_TITLE{get;set;}publicstringMSG_CONTENT{get;set;}}效劳端推送具体类,记录日志,创立消息队列实例,监听,等待收取消息.这里我们使用的是AcitveMQ的.net客户端.ActiveMQListenAdapter是一个封装过的对象.
publicclassMQHubsConfig{privatestaticILoggerlog=newLogger("MQHubsConfig");///<summary>///Registersthemqlistenandhubs.///</summary>publicstaticvoidRegisterMQListenAndHubs(){varactivemq=Megadotnet.MessageMQ.Adapter.ActiveMQListenAdapter<PushMessageModel>.Instance(MQConfig.MQIpAddress,MQConfig.QueueDestination);activemq.MQListener+=m=>{log.InfoFormat("从MQ收到消息{0}",m.MSG_CONTENT);GlobalHost.ConnectionManager.GetHubContext<FeedHub>().Clients.All.receive(m);};activemq.ReceviceListener<PushMessageModel>();}}上面有一句关键代码GlobalHost.ConnectionManager.GetHubContext<FeedHub>().Clients.All.receive(m);
这里使用了GetHubContext方法后,直接来播送消息.需要在MVCApplication下加载:publicclassMvcApplication:{protectedvoidApplication_Start(){AreaRegistration.RegisterAllAreas();FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);BundleConfig.RegisterBundles(BundleTable.Bundles);MQHubsConfig.RegisterMQListenAndHubs();}}同时需要增加一个Starup.cs,用于Owin[assembly:OwinStartup(typeof(RealTimeApp.Startup))]namespaceRealTimeApp{publicclassStartup{publicvoidConfiguration(IAppBuilderapp){//Anyconnectionorhubwireupandconfigurationshouldgohereapp.MapSignalR();}}}接下来是客户端App.js:functionApp(){varinit=function(){Feed();$.=true;$.().done(function(){console.log("Connected!");$(document).trigger("Connected");}).fail(function(){console.log("CouldnotConnect!");});};init();};Feed.js具体与SignalR.js通信,创立名为receive的function,与效劳端对应functionFeed(){varchat=undefined;varinit=function(){//Referencetheauto-generatedproxyforthehub.chat=$.connection.feedHub;//Createafunctionthatthehubcancallbacktodisplaymessages.=function(item){varselector="ul.feed-listli[data-id="+item.Id+"]";if(!($(selector).length>0)){$("ul.feed-list").prepend($(".feed-template").render(item));$("ul.feed-listli:gt(3)").remove();}$.messager.show({title:'Tips',msg:item.MSG_CONTENT,showType:'show'});};//Starttheconnection.$.().done(function(){();});};init();};上面的javascript代码与效劳端有通信,具体看如下列图:在Index.cshtml,
我们需要引用SignalR客户端JS,放置hubs,这里我们使用了jsrender,
easyui.js来呈现推送的消息.@modeldynamic@sectionScripts{<linkhref="/Content/themes/default/window.css"rel="stylesheet"/><linkhref="~/Content/themes/default/progressbar.css"rel="stylesheet"/><linkhref="~/Content/themes/default/linkbutton.css"rel="stylesheet"/><scriptsrc="~/Scripts/jquery.signalR-2.1.2.min.js"></script><!--ReferencetheautogeneratedSignalRhubscript.--><scriptsrc="~/signalr/hubs"></script><scriptsrc="~/Scripts/jsrender.js"></script><scriptsrc="~/Scripts/jquery.easyui.min-1.4.1.js"></script>@Scripts.Render("~/Scripts/project.js")<scripttype="text/javascript">$(document).ready(function(){varapp=newApp();});</script>}<divclass="row-fluid"><divclass="span8"><divclass="widget"><divclass="widget-header"><h2>Feed</h2></div><divclass="widget-content"><ulclass="span12feed-list"></ul></div></div></div></div><scriptclass="chat-template"type="text/x-jquery-tmpl"><li><p>{{>Message}}</p></li></script><scriptclass="feed-template"type="text/x-jquery-tmpl"><lidata-id="{{>Id}}"><divclass="row-fluid"><divclass="span8"><h3>{{>MSG_CONTENT}}</h3></div></div></li></script>上代码效劳端引用js的Script.Render,需要在BundleConfig.cs中参加以下代码:bundles.Add(newScriptBundle("~/Scripts/project.js").IncludeDirectory("~/Scripts/Project","*.js",false));同时我们构建一个WebAPI来发送需要推送的消息,片断代码:///<summary>///SendMessage///</summary>///<paramname="messagemodel">Themessagemodel.</param>///<returns></returns>[HttpPost]publicIHttpActionResultSendMessage(PushMessageModelmessagemodel){returnSendToServer(messagemodel);}///<summary>///Sendstoserver.///</summary>///<paramname="messagemodel">Themessagemodel.</param>///<returns></returns>privateIHttpActionResultSendToServer(PushMessageModelmessagemodel){if(ModelState.IsValid){if(messageRepository.SendMessage(messagemodel)){log.Debug("发送成功!");returnOk();}else{log.ErrorFormat("发送失败!{0}",messagemodel);returnContent(HttpStatusCode.ExpectationFailed,newException("sendmessageerror"));}}else{log.ErrorFormat("参数验证失败!{0}",messagemodel);returnContent(HttpStatusCode.BadRequest,ModelState);}}发送消息到ActiveMQ的关键代码:publicclassMessageRepository:IMessageRepository{privatestaticILoggerlog=newLogger("MessageRepository");///<summary>///发送消息///</summary>///<paramname="messagemodel"></param>///<returns></returns>publicboolSendMessage(PushMessageModelmessagemodel){varactivemq=newActiveMQAdapter<PushMessageModel>(MQConfig.MQIpAddress,MQConfig.QueueDestination);returnactivemq.SendMessage<PushMessageModel>(messagemodel)>0;}}如果您需要运行DEMO程序,需要构建基于ActiveMQ的消息队列,
运行效果是这样的,我们在一个静态html中,发送一个ajax到webapi效劳端,
发送后另一个website网站收到后,列表更新,并在右下角弹出框IE的控制台输出:HTML1300:Navigationoccurred.
File:Index
[11:05:25GMT+0800(ChinaStandardTime)]SignalR:Clientsubscribedtohub'feedhub'.
[11:05:25GMT+0800(ChinaStandardTime)]SignalR:Negotiatingwith'/signalr/negotiate?clientProtocol=1.4&connectionData=%5B%7B%22name%22%3A%22feedhub%22%7D%5D'.
[11:05:25GMT+0800(ChinaStandardTime)]SignalR:Thisbrowserdoesn'tsupportSSE.
[11:05:25GMT+0800(ChinaStandardTime)]SignalR:Bindingtoiframe'sloadevent.
[11:05:25GMT+0800(ChinaStandardTime)]SignalR:Iframetransportstarted.
[11:05:25GMT+0800(ChinaStandardTime)]SignalR:foreverFrametransportselected.Initiatingstartrequest.
[11:05:25GMT+0800(ChinaStandardTime)]SignalR:Thestartrequestsucceeded.Transitioningtotheconnectedstate.
[11:05:25GMT+0800(ChinaStandardTime)]SignalR:Nowmonitoringkeepalivewithawarningtimeoutof13
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025家具购买合同范本
- 结肠脂肪瘤的临床护理
- 2025家电购买合同样本
- 2025年国家电网招聘之电工类通关考试题库带答案解析
- 2025年度出版物销售合同协议
- 初中历史明朝的灭亡和清朝的建立 课件 +2024-2025学年统编版七年级历史下册
- 镰刀型细胞贫血病的临床护理
- 书写痉挛的临床护理
- 小儿胆道蛔虫症的临床护理
- 第三型腹膜炎的临床护理
- 2025年高考历史总复习高中历史必修二八大专题知识复习提纲
- 2025事业单位考试题库及答案200题
- 临床执业医师考试健康教育技能试题及答案
- 机车车辆试题及答案
- 地理澳大利亚课件-2024-2025学年人教版(2024)初中地理七年级下册
- 常用施工规定和技术要求1
- 旅游景区娱乐服务设计
- 亚马逊店铺转让合同标准文本
- T-CQAP 4002-2024 医疗安全(不良)事件根本原因分析法活动指南
- 利用科学史进行高中生物学主线式情境教学的实践研究
- 2025年高考作文备考:十大热点人物事迹+高分素材
评论
0/150
提交评论