Asp-net-SignalR-实现服务端消息推送到Web端_第1页
Asp-net-SignalR-实现服务端消息推送到Web端_第2页
Asp-net-SignalR-实现服务端消息推送到Web端_第3页
Asp-net-SignalR-实现服务端消息推送到Web端_第4页
Asp-net-SignalR-实现服务端消息推送到Web端_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论