close

其實阿龍我從來沒有寫過程式相關的文章,這次會想要分享主要是日記的成分居多怕自己忘記,

另一方面是怕自己學藝不精講錯了誤人子弟!

先從故事的原由說起,原本我的需求很簡單架設一個Web Server然後會有GateWay會推送資料到我的站台來,

我需要整理好後再推播到前端給使用者看,因此在我腦海中就只有一個工具的浮現就是SignalR,

六、七年前同事曾經寫過但是我卻未經手因此對於我來說完全是個陌生的領域,

首先我寫了.net framwork 4.5的版本,但是因為實際應用的伺服器是Linux base的,因此最快最小傷害的方式就是.net core

也就成就了今日的主題,好了以下進入正題:

 

.net framework vs  .net core 乍看之下像是一脈相承,事實上也偏離不遠,諸多語法以及規則都大同小異,

對於Java、C#背景的Programer應該都很熟悉不陌生才對,

但是整體的運作架構卻有著截然的不同,

 

.net foramework 版本 :

1. 上Nuget安裝相關的套件 Microsoft.AspNet.SignalR.js、Microsoft.Owin以及相關元件

2. 建立SignalR的 Hub(中樞) 與 Startup(起點),在程式執行的時候就會自動生成相關的JS檔案讓前端可以呼叫的到

    Hub: 其實也就是讓你放所有SingalR需要用到的方法的位置,例如要傳輸的資料或是需要用來判斷的參數接收

    image

    Startup: 也是透過OWIN來讓系統自動偵測並且啟動的服務類別

    image

3. 在自己的商業邏輯中適當的加入需要推播的程式碼,其實這裡的關鍵在於如何找出SignalR實體的所在位置,因此我們可以透過GlobalHost這個類別庫來尋找Hub所在位置,這樣才能輕鬆的呼叫Hub內的方法

image

如上圖,我們可以從GlobalHost.ConnectionManager.GetHubContext方法來取得SignalRHubs的實體位置,並且呼叫底下的方法,

如此就能完成了以上的工作需求,但是轉成.net Core後卻完全不能使用,因此Google了一下是否做法有很大的差異,

其實研究了兩三日後因為有許多需要手動以及特殊的處理方法,因此筆記下來備忘!若說明有誤也請高手指點,

 

.net Core版本(3.1):

1. 也是先引入相關類別庫,只是這次是要採用unpkg來安裝,其實大同小異的做法

    image

2. 安裝後就會出現相關的JS跟可以用的函式庫,因此第二步驟也式實作 Hub 中梳,稍微不同的是這裡必須寫成非同步作業

其原因我沒有深究,僅是看了教學文章上是這樣寫的

    image

3. 建立SignalR程序的起點,這裡也是最複雜的部份,首先.net Core的服務都是需要在Startup.cs(並非先前.net framework版的Startup)檔案中做註冊因此要在Program.cs中的ConfigureServices中加上你需要使用的服務,然後要在endpoint處指名要Map到哪個類別庫跟檔案名稱要叫做甚麼

    image

於public void Configure(IApplicationBuilder app, IWebHostEnvironment env)方法下加入endpoints.MapHub<HubClassName>("js filename")

    image

這裡就加上 services.AddSignalR(); 若沒加上則程序沒有啟動的點,相關的JS函式庫就不會自動產生,當你開啟頁面就會在Console看到404 page not found的錯誤訊息,

到這裡為止我搞了兩天才搞懂!原來是這樣子SignalR才算正式啟動,啟動後在你需要被推播的頁面上要跟Hub註冊並且實作接收到後要執行的方法

    image

var connection = new signalR.HubConnectionBuilder().withUrl("/signalRHub").build(); 這一行就是與Hub註冊我這邊需要被推播,

withUrl裡面就是寫Program.cs寫的需要產生的JS檔案名稱,從下方就是用connection.on ("Method Name", function(para1, para2) {  // todo })

來實作你需要在介面上做的處理‧

 

最後也是本篇文章的主軸,就是如何從後台去呼叫Hub(中樞)上的方法,在.net framework版本僅區要依照GlobalHost物件來取得SignalR的Context就可以呼叫到Hub的方法,但是在.net Core中必須要透過注入Service的方式才能取得Context,因此需要撰寫一個類別然後實作 IHostedService,  IDisposable介面

    image

並且於程式的起點Program.cs中注入服務,這裡參考文獻的筆者很厲害用了一個很不錯的技巧,就是將Context採用Static的方式來實作,如此就可以實現於任何角落呼叫這個Context然後進而調用到SignalR的方法

    image

調用也很簡單,於任何角落直接下指令就可以調用到SignalRHub中的方法了

image

看起來很簡單的工作流程卻花了我兩三天來研究他,因此必須要筆記下來,供日後查用以及分享給各位格友們

 

 

參考文獻:

 

教學課程:開始使用 ASP.NET Core SignalR

 

OWIN 啟動類別偵測

 

Background tasks with hosted services in ASP.NET Core

 

How to get SignalR Hub Context in a ASP.NET Core?

arrow
arrow
    文章標籤
    .net Core SignalR C#
    全站熱搜

    RyusukeShen 發表在 痞客邦 留言(0) 人氣()