




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
ASignalR實(shí)現(xiàn)效勞端消息推送到Web端之前的文章介紹過ASignalR,
ASP.NETSignalR是一個(gè)ASP.NET下的類庫(kù),可以在ASP.NET的Web工程中實(shí)現(xiàn)實(shí)時(shí)通信.
今天我們來實(shí)現(xiàn)效勞端消息推送到Web端,
首先回憶一下它抽象層次圖是這樣的:實(shí)際上ASignalR2實(shí)現(xiàn)效勞端消息推送到Web端,更加簡(jiǎn)單.為了獲取更好的可伸縮性,我們引入消息隊(duì)列,看如下根本流程圖:消息隊(duì)列MQ監(jiān)聽,在Website效勞端一收到消息,馬上通過Signalr推送播送到客戶端.
創(chuàng)立ASP.NETMVCWEBAPP,
從NuGet安裝SignalR2.12Install-Package具體實(shí)現(xiàn)代碼,是這樣的,我們?cè)黾右粋€(gè)空的Hub:publicclassFeedHub:Hub{publicvoidInit(){}}是簡(jiǎn)單的消息模型,標(biāo)題與正文屬性:
[Serializable]publicclassPushMessageModel{publicintId{get;set;}publicstringMSG_TITLE{get;set;}publicstringMSG_CONTENT{get;set;}}效勞端推送具體類,記錄日志,創(chuàng)立消息隊(duì)列實(shí)例,監(jiān)聽,等待收取消息.這里我們使用的是AcitveMQ的.net客戶端.ActiveMQListenAdapter是一個(gè)封裝過的對(duì)象.
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>();}}上面有一句關(guān)鍵代碼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();}}同時(shí)需要增加一個(gè)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通信,創(chuàng)立名為receive的function,與效勞端對(duì)應(yīng)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來呈現(xiàn)推送的消息.@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));同時(shí)我們構(gòu)建一個(gè)WebAPI來發(fā)送需要推送的消息,片斷代碼:///<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("發(fā)送成功!");returnOk();}else{log.ErrorFormat("發(fā)送失敗!{0}",messagemodel);returnContent(HttpStatusCode.ExpectationFailed,newException("sendmessageerror"));}}else{log.ErrorFormat("參數(shù)驗(yàn)證失?。0}",messagemodel);returnContent(HttpStatusCode.BadRequest,ModelState);}}發(fā)送消息到ActiveMQ的關(guān)鍵代碼:publicclassMessageRepository:IMessageRepository{privatestaticILoggerlog=newLogger("MessageRepository");///<summary>///發(fā)送消息///</summary>///<paramname="messagemodel"></param>///<returns></returns>publicboolSendMessage(PushMessageModelmessagemodel){varactivemq=newActiveMQAdapter<PushMessageModel>(MQConfig.MQIpAddress,MQConfig.QueueDestination);returnactivemq.SendMessage<PushMessageModel>(messagemodel)>0;}}如果您需要運(yùn)行DEMO程序,需要構(gòu)建基于ActiveMQ的消息隊(duì)列,
運(yùn)行效果是這樣的,我們?cè)谝粋€(gè)靜態(tài)html中,發(fā)送一個(gè)ajax到webapi效勞端,
發(fā)送后另一個(gè)website網(wǎng)站收到后,列表更新,并在右下角彈出框IE的控制臺(tái)輸出: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. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高效血液透析的科技與創(chuàng)新探索
- 跨界融合的學(xué)術(shù)交流與合作案例分析
- 共同奮斗共鑄輝煌計(jì)劃
- 名著導(dǎo)讀《駱駝祥子》《海底兩萬(wàn)里》《西游記》超全考點(diǎn)梳理(附題目)
- 班級(jí)游戲活動(dòng)的策劃與總結(jié)計(jì)劃
- 跨班級(jí)交流與合作計(jì)劃
- 金融行業(yè)財(cái)務(wù)管理證券投資與風(fēng)險(xiǎn)控制
- 山東2025年01月青島膠東臨空經(jīng)濟(jì)示范區(qū)管理委員會(huì)2025年公開選聘10名工作人員筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 金融市場(chǎng)中的風(fēng)險(xiǎn)評(píng)估與對(duì)策制定
- 財(cái)務(wù)管理軟件在稅務(wù)管理中的應(yīng)用
- 硬質(zhì)巖層組合切割開挖技術(shù)
- 2024解析:第二章聲現(xiàn)象-講核心(解析版)
- 2024年考研管理類綜合能力(199)真題及解析完整版
- 2024解析:第十章 浮力綜合應(yīng)用-講核心(解析版)
- 《讓座》(課件)西師大版音樂二年級(jí)上冊(cè)
- 廣告創(chuàng)作與視覺傳媒考核試卷
- 藥物臨床試驗(yàn)倫理審查應(yīng)急預(yù)案
- 書法培訓(xùn)合作合同范例
- 初級(jí)電工證考試試題庫(kù)(含答案)
- 現(xiàn)代家政導(dǎo)論-課件 4.1.3認(rèn)識(shí)我國(guó)家政教育發(fā)展
- 四年級(jí)語(yǔ)文下冊(cè) 第一單元 字詞專項(xiàng)練習(xí) (含答案)(部編版)
評(píng)論
0/150
提交評(píng)論