




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第WPF+ASP.NETSignalR實現(xiàn)后臺通知功能的示例代碼目錄涉及知識點前提條件服務(wù)端客戶端運行示例在實際業(yè)務(wù)中,當(dāng)后臺數(shù)據(jù)發(fā)生變化,客戶端能夠?qū)崟r的收到通知,而不是由用戶主動的進(jìn)行頁面刷新才能查看,這將是一個非常人性化的設(shè)計。比如數(shù)字化大屏,并沒有人工的干預(yù),而是自動的刷新數(shù)據(jù),那如何才能實現(xiàn)數(shù)據(jù)的實時刷新呢?本文以一個簡單示例,簡述如何通過WPF+ASP.NETSignalR實現(xiàn)消息后臺通知以及數(shù)據(jù)的實時刷新,僅供學(xué)習(xí)分享使用,如有不足之處,還請指正。
通過上一篇文章的學(xué)習(xí),了解了如何通過SignalR實現(xiàn)在線聊天功能,在示例中,我們發(fā)現(xiàn)每一次的客戶端連接都是一個新的實例對象,所以沒有辦法在中心對象中存儲狀態(tài)信息,所以為了存儲用戶列表,我們采用了靜態(tài)變量的方式。并且在線聊天功能是用戶發(fā)送一條消息(Chat),然后觸發(fā)中心對象(ChatHub),轉(zhuǎn)發(fā)給另一個用戶(SendAsync)。那么如果實現(xiàn)數(shù)字化大屏,需要服務(wù)端持續(xù)的往客戶端發(fā)送消息,而不是客戶端主動觸發(fā),應(yīng)該怎么做呢?這就是本文需要分享的內(nèi)容。
涉及知識點
在本示例中,涉及知識點如下所示:
開發(fā)工具:VisualStudio2025目標(biāo)框架:.NET6.0ASP.NETSignalR,一個ASP.NET下的類庫,可以在ASP.NET的Web項目中實現(xiàn)實時通信,目前新版已支持.NET6.0及以上版本。在本示例中,作為消息通知的服務(wù)端。WPF,是微軟推出的基于Windows的用戶界面框架,主要用于開發(fā)客戶端程序。
前提條件
實現(xiàn)服務(wù)端持續(xù)往客戶端發(fā)送消息,除了業(yè)務(wù)上的需求外,還需要滿足兩個條件:
在服務(wù)端有一個常駐內(nèi)存對象,監(jiān)聽數(shù)據(jù)變化。常駐內(nèi)存對象,可以訪問中心對象(ChatHub),能夠獲取中心對象的所有連接客戶端,并發(fā)送消息。
滿足以上兩個條件,才可以實現(xiàn)想要的功能。
服務(wù)端
經(jīng)過以上分析后,服務(wù)端分為兩方面,核心對象(ChatHub),處理業(yè)務(wù)對象(Worker)。下面我們逐一說明:
ChatHub中心是用于向連接到SignalR服務(wù)器的客戶端發(fā)送消息的核心抽象,負(fù)責(zé)客戶端的連接和斷開。如下所示:
usingMicrosoft.AspNetCore.SignalR;
namespaceSignalRChat.Chat
publicclassChatHub:Hub
publicoverrideTaskOnConnectedAsync()
Console.WriteLine($"ID:{Context.ConnectionId}已連接");
returnbase.OnConnectedAsync();
publicoverrideTaskOnDisconnectedAsync(Exceptionexception)
Console.WriteLine($"ID:{Context.ConnectionId}已斷開");
returnbase.OnDisconnectedAsync(exception);
}
Worker實例為一個單例對象,常駐內(nèi)容,實時監(jiān)聽數(shù)據(jù)變化,并通過ChatHub上下文(IHubContextChatHub)獲取連接信息,然后發(fā)送消息,如下所示:
usingMicrosoft.AspNetCore.SignalR;
namespaceSignalRChat.Chat
publicclassWorker
publicstaticWorkerInstance;
privatestaticreadonlyobjectlocker=newobject();
privateIHubContextChatHubcontext;
privateSystem.Timers.Timertimer;
publicWorker(IHubContextChatHubcontext){
this.context=context;
timer=newSystem.Timers.Timer(500);//單位毫秒
timer.Enabled=true;
timer.AutoReset=true;//自動重新
timer.Elapsed+=Timer_Elapsed;
timer.Start();
privatevoidTimer_Elapsed(objectsender,System.Timers.ElapsedEventArgse)
//模擬數(shù)據(jù),一般情況下,從數(shù)據(jù)庫獲取,然后通知到客戶端
Dictionarystring,objectdata=newDictionarystring,object
varonline=newRandom().Next(0,100);
varmale=Math.Floor(newRandom().NextSingle()*online);
varfemale=online-male;
data["online"]=online;
data["male"]=male;
data["female"]=female;
context.Clients.All.SendAsync("Data",data);
publicstaticvoidRegister(IHubContextChatHubcontext)
if(Instance==null)
lock(locker)
if(Instance==null)
Instance=newWorker(context);
}
注意:此處發(fā)送數(shù)據(jù)的是Data方法,客戶端必須監(jiān)聽Data方法,才能接收數(shù)據(jù)。
如何創(chuàng)建單例對象呢,中心對象上下文不能自己創(chuàng)建,必須要和ChatHub通過注入方式的上下文是同一個,不然無法獲取客戶端連接信息。在項目啟動時,通過中間件的方式創(chuàng)建,如下所示:
usingMicrosoft.AspNetCore.SignalR;
usingSignalRChat.Chat;
varbuilder=WebApplication.CreateBuilder(args);
//Addservicestothecontainer.
builder.Services.AddControllers();
//LearnmoreaboutconfiguringSwagger/OpenAPIathttps://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
//1.添加SignalR服務(wù)
builder.Services.AddSignalR();
varapp=builder.Build();
//ConfiguretheHTTPrequestpipeline.
if(app.Environment.IsDevelopment())
app.UseSwagger();
app.UseSwaggerUI();
app.UseRouting();
app.UseHttpsRedirection();
app.UseAuthorization();
//在Use中注冊單例實例
app.Use(async(context,next)=
varhubContext=context.RequestServices
.GetRequiredServiceIHubContextChatHub();
Worker.Register(hubContext);//調(diào)用靜態(tài)方法注冊
if(next!=null)
awaitnext.Invoke();
app.MapControllers();
//2.映射路由
app.UseEndpoints(endpoints={
endpoints.MapHubChatHub("/chat");
app.Run();
客戶端
客戶端主要是連接服務(wù)器,然后監(jiān)聽服務(wù)端發(fā)送數(shù)據(jù)的方法即可,如下所示:
namespaceSignalRClient
publicclassShowDataViewModel:ObservableObject
#region屬性及構(gòu)造函數(shù)
privateintonli
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 敬老院五保戶合同協(xié)議書
- 木工承包合同協(xié)議書
- 物流公司勞務(wù)合同協(xié)議書
- 離職協(xié)議合同協(xié)議書
- 松樹的承包合同協(xié)議書
- 藝術(shù)培訓(xùn)服務(wù)合同協(xié)議書
- 貸款合同協(xié)議書
- 爆破合同協(xié)議書范本
- 場地項目經(jīng)理合同協(xié)議書
- 地板打蠟合同協(xié)議書范本
- 微博運營方案及工作計劃
- 《體育精神》-體育故事與體育精神培養(yǎng)教案
- 部編本一年級下冊1、吃水不忘挖井人名師公開課獲獎?wù)n件百校聯(lián)賽一等獎?wù)n件
- 投資合同:有限公司投資協(xié)議
- 四川大學(xué)華西口腔醫(yī)院臨床研究醫(yī)學(xué)倫理審查申請表【模板】
- 拖欠房租通知書范文
- 年產(chǎn)萬噸的氯乙烯合成工段的工藝設(shè)計
- 2024年湖北省中考?xì)v史試卷附答案
- 2024年銀行校園招聘入職考試模擬試題及答案(共三套)
- 2024年新疆烏魯木齊市中考化學(xué)適應(yīng)性試卷
- 民法典之合同篇課件
評論
0/150
提交評論