WPF+ASP.NETSignalR實現(xiàn)后臺通知功能的示例代碼_第1頁
WPF+ASP.NETSignalR實現(xiàn)后臺通知功能的示例代碼_第2頁
WPF+ASP.NETSignalR實現(xiàn)后臺通知功能的示例代碼_第3頁
WPF+ASP.NETSignalR實現(xiàn)后臺通知功能的示例代碼_第4頁
WPF+ASP.NETSignalR實現(xiàn)后臺通知功能的示例代碼_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論